为什么运行时程序要分成内核态和用户态

2018-08-25  本文已影响0人  鸡哥cy

        当我们在写程序是,凡是涉及到IO读写、内存分配等硬件资源的操作时,往往不能直接操作,而是通过一种叫系统调用的过程,让程序陷入到内核态运行,然后内核态的CPU执行有关硬件资源操作指令,得到相关的硬件资源后在返回到用户态继续执行,之间还要进行一系列的数据传输。如此麻烦,让用户程序直接访问硬件资源不是更好吗?

        假设没有这种内核态和用户态之分,程序随随便便就能访问硬件资源,比如说分配内存,程序能随意的读写所有的内存空间,如果程序员一不小心将不适当的内容写到了不该写的地方,就很可能导致系统崩溃。用户程序是不可信的,不管程序员是有意的还是无意的,都很容易将系统干到崩溃。

        正因为如此,Intel就发明了ring0-ring3这些访问控制级别来保护硬件资源,ring0的就是我们所说的内核级别,要想使用硬件资源就必须获取相应的权限(设置PSW寄存器,这个操作只能由操作系统设置)。操作系统对内核级别的指令进行封装,统一管理硬件资源,然后向用户程序提供系统服务,用户程序进行系统调用后,操作系统执行一系列的检查验证,确保这次调用是安全的,再进行相应的资源访问操作。内核态能有效保护硬件资源的安全。

        另外,用户程序是通过内部中断来进行系统调用的,触发内部中断的指令是 INT N ,触发中断后CPU根据中断号到中断向量表中查找中断服务程序入口,中断服务程序的处理过程一般是,设置PSW状态字(设置了之后才能执行一切指令),保存用户态上下文,调用过程执行,执行完成恢复用户程序上下文。

上一篇下一篇

猜你喜欢

热点阅读