← 返回首页
内核态和用户态
内核态(Kernel Space)和用户态(User Space)是现代操作系统(如 Linux、Windows)为了保护系统安全、保证多任务稳定运行而设计的两种核心运行级别。
1. 核心概念与区别
- 用户态(User Space):
- 运行对象:我们日常使用的各种应用程序(如微信、浏览器、Nginx、MySQL 等)。
- 权限级别:权限受限。只能访问属于自己进程的内存空间,不能直接访问硬件设备,也不能执行底层的特权指令(如修改内存管理寄存器、直接读写磁盘等)。
- 内核态(Kernel Space):
- 运行对象:操作系统的核心代码(进程调度、内存管理、文件系统、设备驱动等)。
- 权限级别:拥有最高权限。可以执行机器指令集的任何指令,访问所有的内存地址和硬件资源。
2. 为什么要区分这两种状态?
- 安全与隔离:防止某个有 Bug 或恶意的应用程序直接修改系统核心数据或破坏其他程序。
- 稳定性:即使某个用户态程序崩溃(如段错误 Segmentation Fault),也只会影响该进程本身,不会导致整个操作系统蓝屏或死机。
3. 用户态与内核态的切换(高频核心考点)
程序绝大多数时候在用户态运行,但在以下三种情况发生时,CPU 会从用户态切换到内核态:
- 系统调用(System Call):这是主动切换。当用户程序需要底层资源时(如读写文件
read/write、创建进程fork、网络通信socket),必须通过系统调用陷入内核,由操作系统代为执行。 - 异常(Exception):这是被动切换。当程序在用户态运行时发生了内部错误(如除以零、缺页异常 Page Fault、非法指令),CPU 会立即暂停当前程序,切换到内核态由操作系统的异常处理程序来接管。
- 外部中断(Interrupt):这也是被动切换。当硬件设备(如键盘敲击、网卡收到数据包、定时器到期)向 CPU 发送中断信号时,CPU 会暂停当前任务,切换到内核态去处理硬件中断。