河南锦源建设有限公司网站,国内的平面设计网站,中国纪检监察报电子报,wordpress国内社交目录标题为什么需要区分内核空间与用户空间内核态与用户态如何从用户空间进入内核空间整体结构为什么需要区分内核空间与用户空间
在 CPU 的所有指令中#xff0c;有些指令是非常危险的#xff0c;如果错用#xff0c;将导致系统崩溃#xff0c;比如清内存、设置时钟等。如…
目录标题为什么需要区分内核空间与用户空间内核态与用户态如何从用户空间进入内核空间整体结构为什么需要区分内核空间与用户空间
在 CPU 的所有指令中有些指令是非常危险的如果错用将导致系统崩溃比如清内存、设置时钟等。如果允许所有的程序都可以使用这些指令那么系统崩溃的概率将大大增加。 所以CPU 将指令分为特权指令和非特权指令对于那些危险的指令只允许操作系统及其相关模块使用普通应用程序只能使用那些不会造成灾难的指令。比如 Intel 的 CPU 将特权等级分为 4 个级别Ring0~Ring3。 其实 Linux 系统只使用了 Ring0 和 Ring3 两个运行级别(Windows 系统也是一样的)。当进程运行在 Ring3 级别时被称为运行在用户状态而运行在 Ring0 级别时被称为运行在内核态。
内核态与用户态
当进程运行在内核空间时就处于内核态而进程运行在用户空间时则处于用户态。 在内核状态下进程运行在内核地址空间中此时 CPU 可以执行任何指令。运行的代码也不受任何的限制可以自由地访问任何有效地址也可以直接进行端口的访问。 在用户状态下进程运行在用户地址空间中被执行的代码要受到 CPU 的诸多检查它们只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址且只能对任务状态段(TSS)中 I/O 许可位图(I/O Permission Bitmap)中规定的可访问端口进行直接访问。
对于 Linux 来说通过区分内核空间和用户空间的设计隔离了操作系统代码(操作系统的代码要比应用程序的代码健壮很多)与应用程序代码。即便是单个应用程序出现错误也不会影响到操作系统的稳定性这样其它的程序还可以正常的运行(Linux 可是个多任务系统啊)。
所以区分内核空间和用户空间本质上是要提高操作系统的稳定性及可用性。
如何从用户空间进入内核空间
其实所有的系统资源管理都是在内核空间中完成的。比如读写磁盘文件分配回收内存从网络接口读写数据等等。我们的应用程序是无法直接进行这样的操作的。但是我们可以通过内核提供的接口来完成这样的任务。 比如应用程序要读取磁盘上的一个文件它可以向内核发起一个 “系统调用” 告诉内核“我要读取磁盘上的某某文件”。其实就是通过一个特殊的指令让进程从用户态进入到内核态(到了内核空间)在内核空间中CPU 可以执行任何的指令当然也包括从磁盘上读取数据。具体过程是先把数据读取到内核空间中然后再把数据拷贝到用户空间并从内核态切换到用户态。此时应用程序已经从系统调用中返回并且拿到了想要的数据可以开开心心的往下执行了。 简单说就是应用程序把高科技的事情(从磁盘读取文件)外包给了系统内核系统内核做这些事情既专业又高效。
对于一个进程来讲从用户空间进入内核空间并最终返回到用户空间这个过程是十分复杂的。举个例子比如我们经常接触的概念 “堆栈”其实进程在内核态和用户态各有一个堆栈。运行在用户空间时进程使用的是用户空间中的堆栈而运行在内核空间时进程使用的是内核空间中的堆栈。所以说Linux 中每个进程有两个栈分别用于用户态和内核态。
下图简明地描述了用户态与内核态之间的转换 既然用户态的进程必须切换成内核态才能使用系统的资源那么我们接下来就看看进程一共有多少种方式可以从用户态进入到内核态。概括地说有三种方式系统调用、软件中断和硬件中断。这三种方式每一种都涉及到大量的操作系统知识所以这里不做展开。
整体结构
接下来我们从内核空间和用户空间的角度看一看整个 Linux 系统的结构。它大体可以分为三个部分从下往上依次为硬件 - 内核空间 - 用户空间。如下图所示(此图来自互联网) 在硬件之上内核空间中的代码控制了硬件资源的使用权用户空间中的代码只有通过内核暴露的系统调用接口(System Call Interface)才能使用到系统中的硬件资源。其实不光是 LinuxWindows 操作系统的设计也是大同小异。
实际上我们可以将每个处理器在任何指定时间点上的活动概括为下列三者之一 运行于用户空间执行用户进程。 运行于内核空间处于进程上下文代表某个特定的进程执行。 运行于内核空间处于中断上下文与任何进程无关处理某个特定的中断。 以上三点几乎包括所有的情况比如当 CPU 空闲时内核就运行一个空进程处于进程上下文但运行在内核空间。 说明Linux 系统的中断服务程序不在进程的上下文中执行它们在一个与所有进程都无关的、专门的中断上下文中执行。之所以存在一个专门的执行环境就是为了保证中断服务程序能够在第一时间响应和处理中断请求然后快速地退出。
文章来源