今天我就来和大家聊聊什么是Linux内核空间和用户空间,可能很多人都不太懂。为了让大家更好地理解,边肖为大家总结了以下内容。希望你能从这篇文章中有所收获。
本文以32位系统为例,介绍了内核空间和用户空间。
内核空间和用户空间
对于32位操作系统,其寻址空间(虚拟地址空间或线性地址空间)为4G(2的32次方)。也就是说,一个进程的最大地址空间是4G。
操作系统的核心是内核,独立于普通应用。它可以访问受保护的内存空间,并拥有访问底层硬件设备的所有权限。为了保证内核的安全性,目前的操作系统一般会强制用户进程不要直接操作内核。
基本上,虚拟地址空间被操作系统分为两部分,一部分是内核空间,另一部分是用户空间。对于Linux操作系统,最高1G字节(从虚拟地址0xC0000000到0xFFFFFFFF)由内核使用,称为内核空间。较低的3G字节(从虚拟地址0x00000000到0xbffff)由每个进程使用,称为用户空间。
我们可以这样理解上一段:「每个进程的 4G 地址空间中,最高 1G 都是一样的,即内核空间。只有剩余的 3G 才归进程自己使用。」.
下图「换句话说就是, 最高 1G 的内核空间是被所有进程共享的!」描述了每个进程的4G地址空间分配(此图来自互联网):
00-1010在CPU的所有指令中,有一些指令是非常危险的。如果它们被误用,系统将崩溃,例如清除内存和设置时钟。如果允许所有程序使用这些指令,系统崩溃的概率会大大增加。
因此,中央处理器将指令分为特权指令和非特权指令。对于那些危险的指令,只允许操作系统及其相关模块使用,而普通应用只能使用那些不会造成灾难的指令。
例如,英特尔CPU将权限级别分为四个级别:Ring0~Ring3。实际上,Linux系统只使用Ring0和ring 3(Windows系统也是如此)。
当一个进程在Ring3级别运行时,它被称为在用户模式下运行,而当它在Ring0级别运行时,它被称为在内核模式下运行。
00-1010好了,现在我们需要再次解释什么是内核模式和用户模式:「当进程运行在内核空间时就处于内核态,而进程运行在用户空间时则处于用户态。」.
在内核模式下,进程在内核地址空间中运行,此时CPU可以执行任何指令。运行代码不受任何限制,可以自由访问任何有效地址,或者直接访问端口。
在用户模式下,进程在用户地址空间中运行,执行的代码要经过CPU的多次检查。它们只能在映射其地址空间的页表条目中指定的用户模式下访问可访问页的虚拟地址,并且只能直接访问在任务状态部分(TSS)的I/O权限位图中指定的可访问端口。
对于以前的DOS操作系统,没有内核空间、用户空间、内核模式和用户模式等概念。可以认为所有代码都在内核模式下运行,所以用户编写的应用程序代码很容易使操作系统崩溃。
对于Linux,通过区分内核空间和用户空间,操作系统代码(比应用程序代码健壮得多)和应用程序代码被隔离开来。
即使单个应用出现错误,也不会影响操作系统的稳定性,让其他程序也能正常运行(Linux是多任务系统!)。
「所以,区分内核空间和用户空间本质上是要提高操作系统的稳定性及可用性。」
00-1010事实上,所有的系统资源管理都是在内核空间完成的。例如,读写磁盘文件、分配回收的内存、从网络接口读写数据等等。
我们的应用程序不能直接做到这一点。但是我们可以通过内核提供的接口来完成这个任务。
例如,如果一个应用程序想读取磁盘上的一个文件,它可以向内核发起一个“系统调用”,告诉内核:‘我想读取磁盘上的某个文件’。
其实是用一条特殊的指令,让进程从用户状态进入内核状态(在内核空间),在内核空间,CPU可以执行任何指令,包括从磁盘读取数据。具体过程是先把数据读入内核空间,再把数据复制到用户空间,从内核模式切换到用户模式。
此时,应用程序已经从系统调用中返回并获得了所需的数据,因此可以愉快地执行它。简单来说,就是应用把高科技的东西(从磁盘读取文件)外包给系统内核,系统内核专业高效的做这些事情。
>对于一个进程来讲,从用户空间进入内核空间并最终返回到用户空间,这个过程是十分复杂的。举个例子,比如我们经常接触的概念 "堆栈",其实进程在内核态和用户态各有一个堆栈。
运行在用户空间时进程使用的是用户空间中的堆栈,而运行在内核空间时,进程使用的是内核空间中的堆栈。所以说,Linux 中每个进程有两个栈,分别用于用户态和内核态。
下图简明的描述了用户态与内核态之间的转换:
既然用户态的进程必须切换成内核态才能使用系统的资源,那么我们接下来就看看进程一共有多少种方式可以从用户态进入到内核态。
概括的说,有三种方式:系统调用、软中断和硬件中断
。这三种方式每一种都涉及到大量的操作系统知识,所以这里不做展开。
整体结构
接下来我们从内核空间和用户空间的角度看一看整个 Linux 系统的结构。它大体可以分为三个部分,从下往上依次为:硬件 -> 内核空间 -> 用户空间。如下图所示(此图来自互联网):
在硬件之上,内核空间中的代码控制了硬件资源的使用权,用户空间中的代码只有通过内核暴露的系统调用接口(System Call Interface)才能使用到系统中的硬件资源。其实,不光是 Linux,Windows 操作系统的设计也是大同小异。
实际上我们可以将每个处理器在任何指定时间点上的活动概括为下列三者之一:
-
运行于用户空间,执行用户进程。 -
运行于内核空间,处于进程上下文,代表某个特定的进程执行。 -
运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断。
以上三点几乎包括所有的情况,比如当 CPU 空闲时,内核就运行一个空进程,处于进程上下文,但运行在内核空间。
说明:Linux 系统的中断服务程序不在进程的上下文中执行,它们在一个与所有进程都无关的、专门的中断上下文中执行。
之所以存在一个专门的执行环境,就是为了保证中断服务程序能够在第一时间响应和处理中断请求,然后快速地退出。
现代的操作系统大都通过内核空间和用户空间的设计来保护操作系统自身的安全性和稳定性。所以在我们阅读有关操作系统的资料时经常遇到内核空间、用户空间和内核态、用户态等概念,希望本文能够帮助您理解这些基本的概念。
看完上述内容,你们对什么是Linux内核空间与用户空间有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/42837.html