引言你是否想过这样一个问题如果 QQ 程序里有一行恶意代码想要清空你的硬盘操作系统是怎么阻止它的答案就藏在内核态与用户态的设计之中——CPU 在硬件层面就对谁有权执行危险操作做了区分。核心速览CPU 在硬件层面通过PSW 寄存器区分两种状态内核态可执行特权指令和用户态只能执行非特权指令中断是操作系统夺回 CPU 控制权的唯一途径——没有中断一个应用程序就能永久霸占 CPU系统调用是应用程序使用操作系统服务的唯一入口底层通过陷入指令触发前置知识程序是如何运行的在理解运行机制之前需要先搞清楚一个基本概念高级语言代码 编译/翻译 机器指令 │ │ Int x 1; ──────────────────→ 001011000000001101001111 x; 100100100000001100000001机器指令是 CPU 能够识别和执行的最基本命令程序运行的过程本质上就是 CPU 一条一条执行机器指令的过程⚠️ 注意区分Linux/Windows 命令行的ls、cd叫做交互式命令接口不是指令机制一内核态 vs 用户态两类程序两种权限计算机中运行的程序分为两类程序类型编写者权限例子内核程序操作系统开发者微软/苹果/开源社区可以执行所有指令Linux 内核、Windows NT 内核应用程序普通程序员只能执行非特权指令QQ、微信、Chrome由众多内核程序组成的集合就是操作系统内核Kernel它是操作系统最核心、最接近硬件的部分。特权指令 vs 非特权指令CPU 在设计时就把指令划分成了两个阵营指令类型说明举例谁能用特权指令执行结果影响整个系统安全内存清零指令、I/O 端口控制指令仅内核程序非特权指令安全的常规运算加法指令、减法指令、数据传送指令所有程序当 CPU 发现一个应用程序试图执行特权指令时会立即触发中断将控制权强行交还给操作系统。CPU 状态标志PSW 寄存器CPU 内部有一个特殊的寄存器——程序状态字寄存器PSW其中包含一个标志位用于标识当前状态PSW 标志位 1 → 内核态管态 / 核心态 ├─ 正在运行内核程序 ├─ 可以执行特权指令 └─ 可以访问所有内存区域 PSW 标志位 0 → 用户态目态 ├─ 正在运行应用程序 ├─ 只能执行非特权指令 └─ 只能访问被分配的内存区域 记忆技巧内核态 管理员模式用户态 普通用户模式。管理员能改系统设置特权指令普通用户只能用自己的文件。状态切换谁说了算切换流程全景图① 开机 → CPU 处于内核态 → 操作系统内核程序在 CPU 上运行 ② 启动完成 → 用户启动 QQ ③ 操作系统在适当时机让出 CPU → 执行特权指令修改 PSW 为用户态→ QQ 开始运行 ④ QQ 运行过程中产生中断信号如QQ 想要读取硬盘文件 ⑤ CPU 检测到中断 → 硬件自动将 PSW 改为内核态 → 暂停 QQ → 跳转去执行中断处理程序 ⑥ 中断处理完毕后 → 操作系统再次让出 CPU → PSW 改回用户态→ 恢复 QQ 运行⚠️考研核心考点内核态 → 用户态通过执行特权指令修改 PSW 实现用户态 → 内核态通过中断实现由硬件自动完成状态切换中断是操作系统夺回 CPU 控制权的唯一途径机制二中断和异常为什么需要中断设想一个没有中断机制的世界QQ 启动后CPU 就一直运行 QQ 的代码。直到 QQ 自己主动退出或崩溃CPU 才能运行其他程序或交还给操作系统。这在多道程序环境下显然是灾难性的。中断的作用让操作系统内核能够强行夺回 CPU 的控制权。中断的分类判断技巧408 考题中与当前执行的指令有关→ 内中断异常与当前执行的指令无关→ 外中断中断信号来源于 CPU 内部→ 内中断中断信号来源于 CPU 外部→ 外中断中断处理流程① 应用程序在用户态运行 ② 发生中断事件如访问特权指令 / I/O 请求 / 时钟中断 ③ CPU 硬件自动完成保存现场 → 切换为内核态 → 跳转到中断处理程序 ④ 操作系统内核处理中断 ⑤ 处理完毕 → 恢复现场 → 切换回用户态 → 继续运行应用程序机制三系统调用什么是系统调用系统调用是操作系统提供给应用程序使用的程序接口是应用程序请求操作系统服务的唯一方式。应用程序 → 库函数如 printf → 系统调用如 write → 操作系统内核 → 硬件经典例子C 语言的printf(Hello world)→ 底层调用操作系统的write系统调用 → 操作系统控制显示器输出文字系统调用 vs 库函数概念层次举例库函数封装在语言库中printf()、scanf()系统调用操作系统内核提供write()、read()、open()库函数不一定使用系统调用如strlen纯内存操作但涉及 I/O、文件、进程等资源操作的库函数底层一定有系统调用。系统调用的执行过程① 应用程序调用 printf(hello) ② printf 函数内部准备好参数 ③ 执行陷入指令trap触发内中断 ④ CPU 硬件自动切换至内核态跳转到系统调用处理程序 ⑤ 操作系统根据系统调用号执行对应服务如 write ⑥ 执行完成 → 恢复用户态 → 返回结果给应用程序 ⑦ printf 继续执行将结果展示给用户⚠️考研核心考点系统调用底层是通过陷入指令trap / 访管指令触发的陷入指令不是特权指令——应用程序可以执行它来主动请求操作系统服务。三机制关系总结常见疑问陷入指令trap是特权指令吗不是。陷入指令又称访管指令是可以被应用程序执行的它的作用是主动触发一次内中断从而让 CPU 切换到内核态执行系统调用。如果陷入指令是特权指令那应用程序根本无法主动请求操作系统服务系统调用机制就形同虚设了。为什么说中断是操作系统夺回 CPU 控制权的唯一途径因为一旦操作系统把 CPU 使用权交给应用程序通过修改 PSW 切换到用户态它就无法再主动要回来了——唯一能触发状态切换回内核态的就是中断信号。中断可以由时钟时间片到期、I/O 设备、应用程序的非法操作等触发这些机制共同保证了操作系统不会失去对机器的掌控。内中断和外中断怎么快速区分记住一句话“内中断由指令引起外中断与指令无关”。除数为 0 → 与执行的除法指令有关 → 内中断。键盘按键 → 与当前 CPU 执行的指令无关 → 外中断。小结内核态 vs 用户态CPU 硬件层面的权限分级通过 PSW 寄存器标记内核态 → 用户态执行特权指令修改 PSW用户态 → 内核态通过中断实现唯一途径系统调用应用程序请求 OS 服务的唯一入口底层通过陷入指令触发中断分类内中断与指令有关vs 外中断与指令无关下一篇将讲解操作系统的体系结构设计、系统引导流程以及虚拟机技术。