一个操作系统也是由一堆程序组成的。可以想象,CPU的指令有很多,但是在这么多指令中,有一些指令涉及到系统底层。如果某些指令被误用或使用不当,是非常危险的,例如清除内存、设置时钟、修改用户访问权限、分配系统资源等,都可能导致系统崩溃。CPU将这些指令分为特权指令和非特权指令,这样所有的程序就不能使用所有的指令。如果所有程序都能使用它们,系统崩溃将变得非常普遍。操作系统的核心是内核,它独立于普通应用程序,负责管理系统的进程、内存、设备驱动程序、文件和网络系统。它决定了系统的性能和稳定性,因此必须保证内核的安全。为了保护内核的安全,操作系统一般会限制用户进程直接操作内核。32位操作系统的总地址空间为4G(2^32=4GB)。实现这种限制的方式是操作系统将总地址空间划分为对于Linux操作系统:1.高层1G空间(0xC0000000-0xFFFFFFFF)分配给内核,称为内核空间.内核程序运行在内核空间,对应的进程处于内核态(管理态)。2、另外分配给用户的3G空间(0x00000000-0xBFFFFFFF),称为用户空间。用户程序运行在用户空间,对应的进程处于用户态(目标态)。参考我之前写的一篇文章的图片(你写的程序的内存布局你应该知道)。简而言之,每个进程共享1G的内核空间,剩下的3G给进程自己使用。在内核态下,CPU可以执行整套指令系统,也就是说内核态进程可以调用系统的所有资源,但是特权指令只能在内核态下执行,并且是不直接提供给用户。在用户态,只能使用非特权指令,也就是说用户态进程只能进行简单的操作,不能直接调用系统资源。那么CPU如何知道当前是否可以使用特权指令呢?有一个标志寄存器,也称为程序状态字寄存器PSW(ProgramStatusWord),它有一个标志位来标识处理器当前处于哪种状态。例如0为用户态,1为内核态状态,有了这个状态,就可以确定使用哪条指令。Linux操作系统通过区分内核空间和用户空间,将操作系统代码和用户程序代码分开,这样即使某个应用程序出现错误,也不会影响到操作系统。此外,Linux操作系统是一个多任务系统,其他应用程序也可以运行。现代操作系统基本分为内核空间和用户空间,以保护操作系统本身的安全和稳定,这也是区分内核空间和用户空间的本质。
