CPU 状态与特权级

操作系统要保护系统资源,不能让普通应用程序随意执行影响全局状态的指令。因此 CPU 将指令分为两类:

类型 含义 例子
非特权指令 普通应用程序可以执行 加法、减法、普通数据处理
特权指令 只能由操作系统内核执行 修改 PSW、开关中断、清内存、启动 I/O

CPU 也相应分为两种运行状态:

CPU 状态 运行内容 能否执行特权指令 别名
用户态 应用程序 不能 目态
内核态 操作系统内核程序 可以 核心态、管态

CPU 当前处于哪种状态通常由 PSW 中的状态位表示。用户态程序若试图执行特权指令,CPU 会发现权限不匹配,触发异常,转入内核态交给操作系统处理。

1000

CPU 状态切换

内核态到用户态

内核态到用户态通常由内核主动完成。操作系统准备让某个应用程序运行时,会通过特权指令修改 PSW 中的状态位,并恢复该程序的运行现场,使 CPU 回到用户态执行用户程序。

这个方向是“内核让出 CPU 控制权”。

用户态到内核态

用户态程序不能直接把 CPU 改成内核态。用户态到内核态必须由硬件事件触发,常见来源包括:

来源 例子 本质
系统调用 用户程序执行 trap / 访管指令 程序主动请求内核服务,完整过程见 System-Calls
异常 缺页、除 0、非法特权指令 当前指令执行过程中出现特殊情况
外部中断 时钟中断、I/O 完成中断 当前指令外部的设备或时钟事件

这个方向是“操作系统夺回 CPU 控制权”。没有这种机制,应用程序一旦运行,就可能长期占用 CPU,操作系统无法重新获得控制。

异常与中断在状态切换中的作用

这里关心的是异常与中断如何改变 CPU 状态。其完整定义、分类和处理过程见 Exception-And-Interrupt-BriefException-And-Interrupt-Handling

它们在操作系统中的作用:

  1. 让 CPU 从用户态转入内核态。
  2. 让操作系统在必要时重新获得 CPU 控制权。
  3. 为系统调用、I/O 完成、时钟调度、错误处理提供统一入口。

异常来自 CPU 内部,通常与当前正在执行的指令有关。异常发生后,CPU 转入内核态,使内核有机会处理当前指令引发的问题或请求。

系统调用使用 trap / 访管指令主动触发自陷;缺页故障、除 0、用户态执行特权指令等也会触发异常。分类细节见 异常

中断来自 CPU 外部,通常与当前正在执行的指令无关。中断让操作系统可以在用户程序运行期间重新获得 CPU 控制权。

常见中断:

  • 时钟中断:让操作系统周期性获得控制权,可用于计时和调度。
  • I/O 中断:设备完成输入输出后通知 CPU。
  • 不可屏蔽中断:如电源故障等紧急事件。

CPU 通常在一条指令执行结束后检查外部中断。若允许响应,就进入中断响应过程,转到内核中的中断处理程序。

时钟中断和并发

时间片轮转、进程调度等机制需要操作系统周期性取回 CPU。时钟中断提供了这种机会,因此它是多道程序并发运行的重要硬件基础。