作者:悟道山水_805 | 来源:互联网 | 2023-06-29 14:00
以dos为例,早期操作系统里并不区分内核态和用户态,用户程序被执行后,与操作系统一样可以控制全部计算机硬件资源,读写任何寄存器、存储器,改写覆盖操作系统的功能代码内核切换设置
以dos为例,早期操作系统里并不区分内核态和用户态,用户程序被执行后,与操作系统一样可以控制全部计算机硬件资源,读写任何寄存器、存储器,改写覆盖操作系统的功能代码内核切换设置。
给特定操作系统编写用户程序,实际是用户程序编写者与操作系统编写者的合作内核切换设置。在操作系统与用户程序平权的情况下,如果用户程序编写者学艺不精,很容易搞乱操作系统的正常流程,造成死机;如果用户程序编写者心怀恶意,就能把恶意代码直接植入操作系统,通过存储介质和网络扩散传播。这就是dos年代病毒盛行的原因。
为了解决这个问题,在软件层面是做不了什么的,只能在硬件上想办法内核切换设置。可以设想,如果操作系统和用户软件分别拥有自己的cpu和内存,则用户软件有任何异常,操作系统只要重启用户软件的cpu就好了。而用户软件也无法突破自己的硬件限制,去改写破坏操作系统的功能。
当然这样在实践中就过于浪费了内核切换设置。操作系统与用户程序并不需要绝对意义的并行,快速交替执行就可以骗过人类的眼睛。因此cpu并没有设计成系统cpu+用户cpu,而是设计为cpu核心态/用户态。
核心态和用户态大多数寄存器都是共用的,但和操作系统功能和安全密切相关的寄存器只有在核心态才能读写内核切换设置。用户态在硬件上限制了用户态程序只能访问操作系统给定的内存,只能通过调用操作系统给定的接口函数进入核心态才能得到外设资源。
核心态和用户态的本质,个人理解就是在cpu硬件层面对程序能够使用的指令、寄存器、存储器等进行了划分,将用户态程序的功能限制在核心态程序允许的范围内,从而提高系统的安全可靠性内核切换设置。