← 返回首页

内核态和用户态

内核态(Kernel Space)和用户态(User Space)是现代操作系统(如 Linux、Windows)为了保护系统安全、保证多任务稳定运行而设计的两种核心运行级别。

1. 核心概念与区别

  • 用户态(User Space):
    • 运行对象:我们日常使用的各种应用程序(如微信、浏览器、Nginx、MySQL 等)。
    • 权限级别:权限受限。只能访问属于自己进程的内存空间,不能直接访问硬件设备,也不能执行底层的特权指令(如修改内存管理寄存器、直接读写磁盘等)。
  • 内核态(Kernel Space):
    • 运行对象:操作系统的核心代码(进程调度、内存管理、文件系统、设备驱动等)。
    • 权限级别:拥有最高权限。可以执行机器指令集的任何指令,访问所有的内存地址和硬件资源。

2. 为什么要区分这两种状态?

  • 安全与隔离:防止某个有 Bug 或恶意的应用程序直接修改系统核心数据或破坏其他程序。
  • 稳定性:即使某个用户态程序崩溃(如段错误 Segmentation Fault),也只会影响该进程本身,不会导致整个操作系统蓝屏或死机。

3. 用户态与内核态的切换(高频核心考点)

程序绝大多数时候在用户态运行,但在以下三种情况发生时,CPU 会从用户态切换到内核态:
  1. 系统调用(System Call):这是主动切换。当用户程序需要底层资源时(如读写文件 read/write、创建进程 fork、网络通信 socket),必须通过系统调用陷入内核,由操作系统代为执行。
  2. 异常(Exception):这是被动切换。当程序在用户态运行时发生了内部错误(如除以零、缺页异常 Page Fault、非法指令),CPU 会立即暂停当前程序,切换到内核态由操作系统的异常处理程序来接管。
  3. 外部中断(Interrupt):这也是被动切换。当硬件设备(如键盘敲击、网卡收到数据包、定时器到期)向 CPU 发送中断信号时,CPU 会暂停当前任务,切换到内核态去处理硬件中断。