7

Linux为什么区分内核空间和用户空间?

 2 years ago
source link: https://os.51cto.com/article/701867.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
Linux为什么区分内核空间和用户空间?-51CTO.COM
Linux为什么区分内核空间和用户空间?
作者:混说Linux 2022-02-18 00:15:58

程序如果要被CPU执行,就得编译成CPU可以执行的指令,一大堆的程序就变成了一堆的指令。

一个操作系统它也是一堆程序组成的,可以想象CPU的指令是很多的,但是这么多的指令中,有些指令涉及到系统底层的东西,如果有些指令错用或者使用不当是非常危险的,比如清内存、设置时钟、修改用户访问权限、分配系统资源等等,可能导致系统崩溃。

CPU将这些指令进行了分类,分为特权指令和非特权指令,不让所有程序都能使用所有指令,如果所有程序都能使用,那系统崩溃就会变得非常常见了。

操作系统的核心是内核,它是独立于普通的应用程序,负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性,所以一定要保证内核的安全。

为了保护内核的安全,操作系统一般都限制用户进程不能直接操作内核,在32位操作系统总的地址空间4G(2^32 = 4GB),实现这个限制的方式就是操作系统将总的地址空间分为两个部分,对于Linux操作系统:

1. 高位的1G空间(0xC000 0000 - 0xFFFF FFFF)分配给内核,称为内核空间,内核程序运行在内核空间,对应的进程就处于内核态(管态)。

2. 另外3G空间(0x0000 0000 - 0xBFFF FFFF)分配给用户使用,称为用户空间,用户程序运行在用户空间,对应的进程处于用户态(目态)。

617fd25555f8e2476af928a76b24e70b705fc8.png

引用之前写的一篇文章(你该知道你写的程序的内存布局)的图

总之,有1G的内核空间是每个进程共享的,剩下的3G是进程自己使用的。

在内核态下,CPU可以执行指令系统的全集,也就是说内核态进程可以调用系统的一切资源,但是特权指令只能在内核态下执行,它不直接提供给用户使用,用户态下只能使用非特权指令,也就是说用户态进程只能执行简单运算,不能直接调用系统资源。

44c94e3951f45916f1f433addd3f328620586e.png

那么CPU如何知道当前是否可以使用特权指令?

有一个标志寄存器,又称程序状态字寄存器PSW(Program Status Word),有一个标志位来标识处理器当前处于哪一个状态,比如0是处于用户态,1是处于内核态,有了这个状态就能判断该使用什么指令。

Linux操作系统通过区分内核空间和用户空间的这种设计,将操作系统代码和用户程序代码分开,这样即使在某一个应用程序出错,也不会影响到操作系统,再说,Linux操作系统是多任务系统,其它应用程序不也还能运行。

现代操作系统基本上都是分内核空间和用户空间的做法,来保护操作系统自身的安全性和稳定性,这也是区分内核空间和用户空间的本质。

责任编辑:华轩 来源: 今日头条
zanpc.bd208a1.pngzanpchover.fdd60ba.png
weixin.23cd8b3.png 分享到微信
weibo.16d6b4f.png 分享到微博

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK