如何理解用户态和内核态?
简介
下图为 Linux 32位操作系统的进程空间分配图(来源于网络),低位的 3G 属于进程自己使用的内存,高位的 1G 是内核空间,内核空间由所有进程共享。
内核空间和用户空间指的是虚拟内存。当进程运行在内核空间时就处于内核态,当进程运行在用户空间时就处于用户态。
现代CPU主要的设计目标就是多任务系统,多任务系统的三个核心特征:权限分级、数据隔离、任务切换。内核态和用户态的概念,就是为了实现多任务系统的权限分级、数据隔离。
有什么区别呢?
内核空间用于运行操作系统内核、硬件驱动,用户空间给普通应用程序使用。比如一应用程序想访问打印机,而打印机驱动运行于内核空间,此时需要切换到内核态运行。
为什么要这么划分呢?
如果程序直接访问硬件资源,一旦程序有恶意或错误的行为,会导致其它程序无法正常运行。
所以引入一个协调者,就是操作系统,由操作系统来协调。(也有其它好处,如操作系统屏蔽了底层硬件细节,提供高层次的抽象,使应用程序开发更简单、更通用)
CPU指令
CPU指令是分权限的,这是因为CPU是可以直接访问硬件资源的。普通应用程序可以执行非特权指令。
用户态和内核态切换
- 系统调用(软中断):系统调用是操作系统提供给应用程序的API,如程序读取某个硬盘上的文件,CPU发现该指令是特权指令,需要在内核态运行,此时 CPU 就会通过中断切换到内核态,处理完成后CPU再切换回用户态。
- 硬件中断:如网络数据准备就绪,就会触发硬中断,通知应用程序处理。(为什么这么设计呢 ?有时间写下)
- 异常:如程序读取数据时,发生缺页,即内存里没有该数据,此时 CPU 会通过异常切换到内核态。
切换肯定有开销,简单来说有以下几点
- 保留用户态上下文
- 执行内核态代码
- 复制内核态执行结果到用户态空间
- 恢复用户态上下文
本文作者:walter007
本文链接:https://www.cnblogs.com/walterlee/p/17667301.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步