一、操作系统
- 作用:服务应用、管理应用
- 服务应用
- 为应用提供计算资源的抽象(CPU、内存、IO设备)
- 为应用提供线程间的同步
- 为应用提供进程间的同步
- 管理应用
- 生命周期的管理
- 计算资源的分配(CPU、内存、IO设备)
- 安全与隔离(应用程序内部以及应用程序之间)
- 避免单个应用独占所有资源(每10ms发生一个时钟中断-时间片/通过信号打断当前任务的执行)
- 目标差异
- 服务应用:单个应用的运行效率最大化
- 管理应用:系统资源的利用率最大化
- 两者的目标可能存在冲突。公平的调度策略,往往资源利用率低。
- 操作系统的启动过程
- 硬件初始化工作并开启页表
- 主CPU启动且其他次CPU等待
- 层级切换:其他ELX 切换到 EL1(内核)
- 准备函数栈(设置SP寄存器)和异常向量(为了debug)
- 内存空间初始化(映射到IO的内存空间)
- 初始化页表并开启MMU(将内核kernel代码映射到低地址段和高地址段两份;低地址段与物理地址相同,方便启动 方便同时访问,启动完毕之后会把低地址段去掉)。
- 进入内核
二、中断与异常
- 中断:外部硬件设备所产生的信号。
- 异步:产生的原因 与 当前执行指令 无关。
- 异常:软件程序的执行所产生的信号,包括系统调用-即用户程序请求操作系统提供服务。
- 同步:产生的原因 与 当前执行指令或试图执行的指令 有关。
- 中断与异常的处理
- ① 正常执行过程中CPU发现中断或异常(User)
- ② 进入中断和异常处理(kernel)
- 保存处理器状态、错误信息、部分上下文信息存储在寄存器中,方便之后恢复执行
- (该寄存器不可在用户态中访问,从而保证安全性)
- 准备好在高特权级下执行工作的环境
- ③ 查询异常向量表,选择合适的异常处理器Handler执行代码(kernel)
- 保证用户态和内核态之前的隔离
- 处理中断或异常过程中,获得关于异常的信息,比如系统调用的参数、错误的原因等
- ④ 处理完毕,从Handler中返回到断点位置(User用户空间)
- 恢复处理器状态
- 返回低特权级
- 继续正常执行流
- 处理中断和处理异常的差异:使用同一套机制,差异仅在选择Handler中体现。
三、系统调用
- 系统调用,指的是运行在用户空间的程序,向操作系统的内核 请求需要更多高权限运行的服务。提供了用户程序与操作系统之间的接口。
- 系统调用(或者需要从用户态往内核态处理时)会造成大量性能开销。
- 当操作所需要的数据状态保存可以用户态的栈上时,需要复制到内核态的栈上,从而增加了上下文保存的开销。
- 硬件优化:新增新的系统调用指令,减少上下文保存的开销。
四、操作系统内核架构
| 简要结构 |
- 将应用程序与操作系放置在同一个地址空间。
- 优点:应用程序对于操作系统服务的调用,可以直接通过函数调用来高效完成。
- 缺点:任何一个应用或者操作系统模块出现问题,都会导致整个系统崩溃。
- 举个栗子:MS-DOS(MicroSoft Disk Operating System)。
- 使用场景:主要运行在微控制单元等相对比较简单的硬件上,这些硬件通常没有提供现代意义上的内存管理单元MMU,隔离能力相对较弱或者缺失隔离能力,因此难以运行复杂的操作系统。
| 宏内核 |
- 又称单内核。
- 操作系统内核的所有模块均运行在内核态,具有直接操作硬件的能力,包括进程调度模块、内存管理模块、文件系统模块、设备驱动模块等。
- 缺点:所有内核模块均运行在特权空间,一个单点的错误会导致整个系统崩溃或者被攻破。
- 举个栗子:UNIX/Linux 。
| 微内核 |
- 对操作系统进行了解耦,将单个功能或者单个模块从内核中拆分出来,作为一个独立的服务部署到独立的运行环境中;内核仅保留极少的功能,为这些服务提供通信等基础功能,使其能够互相协作以完成操作系统所必需的功能。
- 优点:服务之间是完全隔离的,有效提高操作系统的可靠性和安全性。
- 举个栗子:经历了从 Mach -- L4 --- Capability机制 的变化。
- Mach 将很多内核功能以单独服务的形式运行在用户态。然而其对 IPC 的设计过于通用,加上 Mach 微内核自身资源占用过大(包括内存占用和CPU缓存占用)等问题,使得其性能表现较差。
- L4:通过高性能的 IPC 实现以及极小化的微核 ukernel(微内核系统中的内核部分),L4 微内核架构操作系统的性能表现较好。
- Capability 机制:将能力机制(Capability 机制)引入微内核操作系统从而增强微内核的安全性,实现访问控制。Capability 机制允许更精确、更细粒度地给不同的应用程序授予对内核对象的调用权限,从而更好地提升系统的安全性。