如何理解用户态和内核态?

 简介

下图为 Linux 32位操作系统的进程空间分配图(来源于网络),低位的 3G 属于进程自己使用的内存,高位的 1G 是内核空间,内核空间由所有进程共享。

 

内核空间和用户空间指的是虚拟内存。当进程运行在内核空间时就处于内核态,当进程运行在用户空间时就处于用户态。

 

现代CPU主要的设计目标就是多任务系统,多任务系统的三个核心特征:权限分级、数据隔离、任务切换。内核态和用户态的概念,就是为了实现多任务系统的权限分级、数据隔离。

 
有什么区别呢?
  内核空间用于运行操作系统内核、硬件驱动,用户空间给普通应用程序使用。比如一应用程序想访问打印机,而打印机驱动运行于内核空间,此时需要切换到内核态运行。
 
为什么要这么划分呢?
  如果程序直接访问硬件资源,一旦程序有恶意或错误的行为,会导致其它程序无法正常运行。
 
  所以引入一个协调者,就是操作系统,由操作系统来协调。(也有其它好处,如操作系统屏蔽了底层硬件细节,提供高层次的抽象,使应用程序开发更简单、更通用)
 
 

CPU指令

  CPU指令是分权限的,这是因为CPU是可以直接访问硬件资源的。普通应用程序可以执行非特权指令。

 

用户态和内核态切换

  • 系统调用(软中断):系统调用是操作系统提供给应用程序的API,如程序读取某个硬盘上的文件,CPU发现该指令是特权指令,需要在内核态运行,此时 CPU 就会通过中断切换到内核态,处理完成后CPU再切换回用户态。
  • 硬件中断:如网络数据准备就绪,就会触发硬中断,通知应用程序处理。(为什么这么设计呢 ?有时间写下)
  • 异常:如程序读取数据时,发生缺页,即内存里没有该数据,此时 CPU 会通过异常切换到内核态。

 

切换肯定有开销,简单来说有以下几点

  • 保留用户态上下文
  • 执行内核态代码
  • 复制内核态执行结果到用户态空间
  • 恢复用户态上下文

 

 

posted @ 2023-08-30 16:15  walterlee  阅读(26)  评论(0编辑  收藏  举报