内核态与用户态:区别、切换时机与执行流程
两种运行状态
| 状态 | 说明 |
|---|---|
| 内核态 Kernel Mode | CPU 运行操作系统内核代码,拥有最高权限,可以直接访问硬件、管理内存、处理中断 |
| 用户态 User Mode | CPU 运行普通应用程序代 码,权限受限,不能直接操作硬件,必须通过系统调用向内核请求服务 |
这样设计的目的是保护系统的安全与稳定,防止用户程序随意破坏内核或访问其他进程的资源。
切换时机
- 系统调用:程序主动请求内核服务,如
read、write、fork。 - 中断:硬件中断发生,如时钟中断、键盘输入、网卡收包。
- 异常 / 陷阱:程序运行出错,如缺页异常、除零错误。
计算机体系结构(自上而下)
应用程序(App)
↓
Shell(命令解释器)
↓
系统 调用接口(System Call)
↓
操作系统内核(Kernel)—— 进程管理 / 内存管理 / 文件系统 / 设备驱动
↓
硬件抽象层 / 驱动
↓
硬件(CPU、内存、磁盘、网卡等)
以执行 ls -l 为例的完整流程
- 用户输入:在终端输入
ls -l,回车。 - Shell 解析:Shell(如 bash)读取命令,解析出命令名
ls和参数-l。 - 查找程序:Shell 在
PATH指定的目录中查找ls可执行文件。 - 创建进程:Shell 调用
fork()系统调用,复制出一个子进程。 - 切换程序:子进程调用
exec()系统调用,加载ls程序,替换进程的代码段。 - 用户态执行:
ls在用户态运行,进行逻辑处理。 - 系统调用请求资源:
ls需要读取 目录信息,调用open()、read()等系统调用,CPU 从用户态切换到内核态。 - 内核处理:内核通过文件系统模块和磁盘驱动,读取目录项数据。
- 返回用户态:内核把数据返回给
ls进程,切换回用户态。 - 输出结果:
ls格式化数据,调用write()输出到终端(又一次用户态 ↔ 内核态切换)。 - 进程结束:
ls执行完毕,调用exit(),内核回收进程资源。 - Shell 等待:父进程(Shell)通过
wait()得知子进程结束,打印新的命令提示符。
这个过程完整体现了「应用 → Shell → 系统调用 → 内核 → 硬件」的分层调用,以及用户态与内核态的多次切换。