MENU

聊聊内核态与用户态

July 22, 2018 • Code

前言:内核态与用户态是操作系统中的相关概念。

什么是内核态 & 用户态

内核态(Kernel Mode)与用户态(User Mode)可以看作是不同 CPU 权限下的进程执行状态:

  • 内核态:特权状态,此时的 CPU 可对所有系统资源进行调用和分配,并且可以访问所有的内存地址。
  • 用户态:非特权状态,当进程处于用户态时,CPU 所能访问的内存地址及分配的资源都大大受限。一般用户运行的程序初始都处于用户态

在操作系统中,一般程序调用系统资源过程如下图:

可看出:

  • 应用程序通过操作系统内核间接调用计算机硬件资源。
  • 操作系统内核向上提供应用程序访问接口,向下负责硬件资源管理调配。

从另一个角度理解用户态与内核态:应用程序进程所允许进行的操作集合或 CPU 指令集合为用户态,而 kernel 所允许进行的为内核态(包含所有操作)。

分状态原因

操作系统将进程状态分为内核态与用户态主要是为了将对重要资源的访问控制权和关键操作的执行权力交给操作系统,提高安全性。如果用户可以直接对一些关键资源进行访问,可能会导致操作系统崩溃或计算机停机等严重问题。

同时,由操作系统管理关键操作及访问还可减少资源访问的冲突。

内核空间 & 用户空间

以 32 位 Linux 系统为栗,针对每个进程而言,虚拟内存共 4 GB

  • 前 1 GB 为内核空间(虚拟地址0xC0000000到0xFFFFFFFF),与内核相关的操作都在此空间中完成。
  • 其中后 3 GB 为用户空间(从虚拟地址0x00000000到0xBFFFFFFF),用户态进程所活跃的空间。

操作系统为进程分配空间时会为其分配两个栈:用户栈与内核栈。

  • 当进程处于用户态时,所产生的状态及数据会保存在用户栈。
  • 当进程处理内核态时,相应地执行及产生的数据会存储在内核栈。

当进程需要从用户态切换到内核态以执行更高权限操作时,进程会从用户空间进行内核空间,同时将栈切换为内核栈。

内核空间为共享空间,即所有的进程对应的内核空间都为同一段。

ring

用户态与内核态是操作系统CPU执行权限的划分,建立在处理器访问控制权限机制之上。不同处理器机制不同,而 intel-x86 处理器对访问控制权限的规则称为 Protection ring

Protection ring 将 CPU 的权限状态分为 4 层:

其中 Ring0 等级最高(等同于内核态),Ring3 等级最低(等同于用户态)。

中间两层一般为某些驱动程序持有状态。

两种状态切换

程序调用系统资源过程图可知,当用户的应用程序进程需要进行一些在用户态无权完成的操作(如对硬件资源的调用)时,需要进行进程状态切换操作:将进程由用户态切换到内核态,进入内核空间进行系统级操作。主要有三种切换方式:

  • 系统调用:(进程主动)操作系统提供对硬件资源操作的最小功能单位。只向用户提供功能,屏蔽底层操作系统的实现机制,从而简化用户操作,同时增强移植性。(类似面向对象中的接口)
  • 异常:(进程被动)当前用户态进程出现不可预知异常,需要转入内核态进行相关异常处理流程,如缺页异常。
  • 外围设备产生的中断:(进程被动)外围设备完成用户请求操作时向 CPU 发出一个中断信号,此时 CPU 会暂停执行下一条指令而转入中断信号所对应的中断处理程序,此时进程的状态为内核态(操作硬件,如读写硬盘等),如果之前状态为用户态,则自然会从用户态切换到内核态

三者都基于中断响应机制。

其中系统调用又分为:

  • 直接系统调用:直接调用操作系统提供的 API。
  • 库函数:对系统调用进行封装,提供简单的业务逻接口。
  • shell 脚本:也是对系统调用进行封装,每个 shell 语句背后对应着一个或多个系统调用。

431521-20160523163606881

上图来自 Linux探秘之用户态与内核态

概览图:

扩展:「root & 非 root」与「内核态 & 用户态」异同

相同:两者都是权限管理。

不同:

  • 「root & 非 root」属于用户权限管理。操作系统为用户分配软件资源访问权限。(软件
  • 「内核态 & 用户态」是 CPU 权限管理。操作系统为进程分配 CPU 权限级别。(硬件

两者没有必然的联系。举个栗子: root 与非 root 用户可以访问文件系统,而文件管理系统的访问需要内核态进程,意味着 root 与非 root 用户都可进行用户态\(\rightarrow\)内核态切换。

几张详细的程序调用系统资源过程图(来自 wiki)

图 1:
1280px-Linux_AMD_graphics_stack.svg

图 2:
Linux_kernel_ubiquity.svg-2

图 3:

小结

介绍了

  • 内核态与用户态的概念
  • 分状态原因
  • 内核空间 & 用户空间
  • 内核栈 & 用户栈
  • 内核态与用户态切换方法(中断响应)

参考

Last Modified: July 30, 2018
Archives QR Code
QR Code for this page
Tipping QR Code
Leave a Comment