框架图解
一、什么是用户态?
- 用户态指的是应用程序代码所在的运行模式和虚拟地址空间。常见的用户程序如浏览器、编辑器、聊天工具等都在用户态运行。
- 用户态程序无法直接访问硬件或内核敏感资源。当需要进行如文件访问、网络通信等敏感操作时,必须通过受控的机制(如系统调用)请求内核提供服务。
二、什么是内核态?
- 内核态是操作系统内核及其部分扩展(如硬件驱动、调度、内存管理等)运行时的高特权模式。在这个模式下,代码可直接访问所有硬件资源和内存空间。
- 内核态虽然拥有最高权限,但内核代码必须遵循严格的接口和上下文规则,如不允许在某些上下文中休眠、必须保证同步安全等。违规会导致内核 panic 或系统不稳定。
- 现代 Linux 还支持如 FUSE、eBPF 等机制,允许部分系统功能在用户空间实现,但核心控制始终归内核管理。
三、为什么要区分这两种态?
区分两种运行态,主要是保障系统安全性、稳定性与隔离性:
- 如果普通应用程序(用户态)能直接操作硬件或系统资源,将极易导致整个系统安全和稳定性被破坏,一旦出现 Bug,后果严重。
- 因此,所有敏感和高权限的操作都由内核态统一调度和管理。用户程序只能通过受控的系统调用接口请求服务,这样可以保护内核和系统其他部分不被用户程序直接影响或破坏。
用户态与内核态之间的切换是通过受控的机制——如“陷入(trap)”或系统调用——实现的。这种机制确保了对系统资源的访问必须经过严格授权和检查。
四、如何理解两种态的工作方式
INFO
- 把「用户态」想象成你在银行大厅,可以自由活动,但不能进去柜台后面的操作区。
- 「内核态」就像银行的金库和操作区,只有银行员工(内核)才能接触和操作。
- 你(用户程序)需要办理业务(比如取钱)时,得通过柜台(系统调用)告诉工作人员(内核)帮你操作。
实际示例:
用户态调用
read():- 实际上
read()会触发系统调用,进入内核态由内核从磁盘/缓存读取数据再返回。
- 实际上
缺页(page fault):
访问未分配内存->CPU 触发 page fault->内核在内核态分配/加载页面->返回用户态继续执行(或进程被杀死)。
日常使用的软件其中
99%都是在用户态运行的,只有在请求操作系统干活的时候(比如用到硬件、创建进程、访问文件等),才会临时进入内核态。
WARNING
写驱动、写内核模块,就是直接在内核态下工作,要更谨慎,否则会导致系统异常。