# 操作系统的运行机制
应用程序:普通程序员编写的程序就是 "应用程序"
内核程序:实现操作系统的程序就是内核程序。由很多内核程序组成了 "操作系统内核",或简称内核。内核是操作系统最重要最核心的部分,也是最接近硬件的部分
操作系统的功能未必都在内核中,如图形化界面 GUI
- 特权指令
- 操作系统内核作为 "管理者",有时会让 CPU 执行一些 "特权指令",如:内存清零指令。这些指令影响重大,只允许 "管理者"—— 即操作系统内核来使用
- 非特权指令
- 应用程序使用的指令即为 "非特权指令",如:加法指令、减法指令等
在 CPU 设计和生产的时候就划分了特权指令和非特权指令,因此 CPU 在执行一条指令前就能判断出其类型
- 内核态
- 处于内核态时,说明此时正在运行的是内核程序,此时可以执行特权指令
- 用户态
- 处于用户态时,说明此时正在运行的是应用程序,此时只能执行非特权指令
拓展:CPU 中有一个寄存器叫程序状态寄存器 (PSW),其中有个二进制位,1 表示内核态,0 表示用户态
别名:内核态 = 核心态 = 管态;用户态 = 目态
# 内核态、用户态的切换
内核态 -> 用户态:执行一条特权指令 —— 修改 PSW 的标志位为用户态,这个动作意味着操作系统将主动让出 CPU 使用权
用户态 -> 内核态:由中断引发,硬件自动完成变态过程,触发中断信号意味着操作系统将强行夺回 CPU 的使用权
注:除了非法使用特权指令外,还有很多事件会触发中断信号。一个共性是,但凡需要操作系统介入的地方,都会触发中断信号
# 中断和异常
中断的作用:
- 让操作系统内核强行夺回 CPU 的控制权
- 让 CPU 从用户态变为内核态
# 中断
内中断
与当前执行的指令有关,中断信号来源于 CPU 内部(陷阱、陷入、故障、终止)
例子:
- 在用户态下执行特权命令
- 执行除法指令时发现除数为 0
- 若当前执行的指令是非法的,则会引发一个中断信号
- 程序请求操作系统内核的服务,会执行一条特殊的指令 —— 陷入指令,该指令会引发一个内部中断信号
- 执行陷入指令,意味着应用程序主动地将 CPU 控制权还给操作系统内核。"系统调用" 就是通过陷入指令完成的
外中断
与当前执行的指令无关,中断信号来源于 CPU 外部
例子:
- 时钟中断 —— 由时钟部件发来的中断信号
- I/O 中断请求
内中断一般称为异常,外中断就是狭义的中断
中断机制的基本原理
不同的中断信号,需要用不同的中断处理程序来处理。当 CPU 检测到中断信号后,会根据中断信号的类型去查找 "中断向量表",以此来找到相应的中断处理程序在内存中的存放位置
# 系统调用
操作系统作为用户和计算机硬件之间的接口,需要向上提供一些简单易用的服务。主要包括命令接口和程序接口。其中,程序接口由一组系统调用组成。
系统调用是操作系统提供给应用程序 (程序员 / 编程人员) 使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以通过系统调用来请求系统内核的服务
系统调用与库函数区别
从下往上依次层次增加
普通应用程序 | 可直接进行系统调用,也可使用库函数。有的库函数涉及系统调用,有的不涉及 |
---|---|
编程语言 | 向上提供库函数,有时会将系统调用封装成库函数,以隐藏系统调用的一些细节,使程序员更加方便 |
操作系统 | 向上提供系统调用,使得上层程序能请求内核的服务 |
裸机 |
为什么系统调用是必须的
由操作系统内核对共享资源进行统一的管理,并向上提供 "系统调用",用户进程想要使用打印机这种共享资源,只能通过系统调用向操作系统内核发出请求。内核对各个请求进行协调处理
系统调用
- 设备管理:完成设备的请求 / 释放 / 启动等功能
- 文件管理:完成文件的读 / 写 / 创建 / 删除等功能
- 进程控制:完成进程的创建 / 撤销 / 阻塞 / 唤醒等功能
- 进程通信:完成进程之间的消息传递 / 信号传递等功能
- 内存管理:完成内存的分配 / 回收等功能
应用程序通过系统调用请求操作系统的服务。而系统中各种共享资源都由操作系统内核统一掌管,因此凡是与共享资源有关的操作 (如存储分配、I/O 操作、文件管理等),都必须通过系统调用的方式向操作系统内核提出服务请求,由操作系统内核代为完成。这样可以保证系统的稳定性和安全性,防止用户进行非法操作
系统调用过程
传递系统调用参数 -> 执行陷入命令 (用户态)-> 执行相应的内请求核程序处理系统调用 (核心态)-> 返回应用程序
注意:
- 陷入指令是在用户态执行的,执行陷入指令之后立即引发一个内中断,是 CPU 进入核心态
- 发出系统调用请求是在用户态,而对系统调用的相应处理在核心态下进行
# 操作系统的体系结构
# 操作系统的内核
内核是操作系统最基本、最核心的部分。
实现操作系统内核功能的那些程序就是内核程序
操作系统内核:
- 时钟管理:实现计时功能
- 中断处理:负责实现中断机制
- 原语:
- 是一种特殊的程序
- 处于操作系统的最底层,是最接近硬件的部分
- 这种程序的运行具有原子性 —— 其运行只能一气呵成,不可中断
- 运行时间较短、调用频繁
- 对系统资源进行管理的功能
- 进程管理
- 存储器管理
- 设备管理
注:上三条是与硬件关联较紧凑的模块,最后一条的管理工作更多是对数据结构的操作,不会直接涉及硬件
操作系统两种体系结构
大内核:
- 将操作系统的主要功能模块都作为系统内核,运行在核心态
- 优点:高性能
- 缺点:内核代码庞大,结构混乱,难以维护
微内核:
- 只把最基本的功能保留在内核
- 优点:内部功能少,结构清晰,方便维护
- 缺点:需要频繁地在核心态和用户态之间切换,性能低
操作系统结构
注:标星号的重点关注
# 操作系统引导
操作系统的引导(开机过程):
- CPU 从一个特定主存地址开始,读指令,执行 ROM 中的引导程序 (先进行硬件自检,再开机)
- 将磁盘的第一块 —— 主引导记录读入内存,执行磁盘引导程序,扫描分区表
- 从活动分区 (又称主分区,即安装了操作系统的分区) 读入分区引导记录,执行其中的程序
- 从根目录下找到完整的操作系统初始化程序 (即启动管理器) 并执行,完成 "开机" 的一系列动作
例:Windows 操作系统的初始化程序可在 "根目录 / Windows/Boot" 下找到
# 虚拟机
虚拟机:使用虚拟技术,将一台物理机器虚拟化为多台虚拟机器,每个虚拟机器都可以独立运行一个操作系统
同义术语:虚拟机管理程序 / 虚拟机监控程序
第一类 VMM,直接运行在硬件上
第二类 VMM,运行在宿主操作系统上
两类虚拟管理程序 (VMM) 的对比
第一类 VMM | 第二类 VMM | |
---|---|---|
对物力资源的控制权 | 直接运行在硬件之上,能直接控制和分配物理资源 | 运行在 Host OS 之上,依赖于 Host OS 为其分配物力资源 |
资源分配方式 | 在安装 Guest OS 时,VMM 要在原本的硬盘上自行分配存储空间,类似于 "外核" 的分配方式,分配未经抽象的物理操作 | Guest OS 拥有自己的虚拟内核,该盘实际上时 Host OS 文件系统中的一个大文件,Guest OS 分配到的内存是虚拟内存 |
性能 | 性能更好 | 性能更差,需要 HostOS 作为 "中介" |
可支持的虚拟机数量 | 更多,不需要和 Host OS 竞争资源,相同的硬件资源可以支持更多的虚拟机 | 更少,Host OS 本身需要使用物理资源,Host OS 上运行的其他程序也需要物理资源 |
虚拟机的可迁移性 | 更差 | 更好,只是导出虚拟机镜像文件即可迁移到另一台 HostOS 上,商业化应用更广泛 |
运行模式 | 第一类 VMM 运行在最高特权级,可以执行最高特权的指令 | 第二类 VMM 部分运行在用户态,部分运行在内核态,Guest OS 发出的系统调用会被 VMM 截获,并转化为 VMM 对 HostOS 的系统调用 |