跳到主要内容

内核态与用户态:区别、切换时机与执行流程

两种运行状态​

状态说明
内核态 Kernel ModeCPU 运行操作系统内核代码,拥有最高权限,可以直接访问硬件、管理内存、处理中断
用户态 User ModeCPU 运行普通应用程序代码,权限受限,不能直接操作硬件,必须通过系统调用向内核请求服务

这样设计的目的是保护系统的安全与稳定,防止用户程序随意破坏内核或访问其他进程的资源。

切换时机​

  1. 系统调用:程序主动请求内核服务,如 read、write、fork。
  2. 中断:硬件中断发生,如时钟中断、键盘输入、网卡收包。
  3. 异常 / 陷阱:程序运行出错,如缺页异常、除零错误。

计算机体系结构(自上而下)​

应用程序(App)
↓
Shell(命令解释器)
↓
系统调用接口(System Call)
↓
操作系统内核(Kernel)—— 进程管理 / 内存管理 / 文件系统 / 设备驱动
↓
硬件抽象层 / 驱动
↓
硬件(CPU、内存、磁盘、网卡等)

以执行 ls -l 为例的完整流程​

  1. 用户输入:在终端输入 ls -l,回车。
  2. Shell 解析:Shell(如 bash)读取命令,解析出命令名 ls 和参数 -l。
  3. 查找程序:Shell 在 PATH 指定的目录中查找 ls 可执行文件。
  4. 创建进程:Shell 调用 fork() 系统调用,复制出一个子进程。
  5. 切换程序:子进程调用 exec() 系统调用,加载 ls 程序,替换进程的代码段。
  6. 用户态执行:ls 在用户态运行,进行逻辑处理。
  7. 系统调用请求资源:ls 需要读取目录信息,调用 open()、read() 等系统调用,CPU 从用户态切换到内核态。
  8. 内核处理:内核通过文件系统模块和磁盘驱动,读取目录项数据。
  9. 返回用户态:内核把数据返回给 ls 进程,切换回用户态。
  10. 输出结果:ls 格式化数据,调用 write() 输出到终端(又一次用户态 ↔ 内核态切换)。
  11. 进程结束:ls 执行完毕,调用 exit(),内核回收进程资源。
  12. Shell 等待:父进程(Shell)通过 wait() 得知子进程结束,打印新的命令提示符。

这个过程完整体现了「应用 → Shell → 系统调用 → 内核 → 硬件」的分层调用,以及用户态与内核态的多次切换。

相关笔记​