用户代码和操作系统代码是如何在CPU上面运行的(用户态和内核态)
简介:
用户代码和操作系统代码是如何在CPU上面运行的(用户态和内核态)
1.CPU的四种状态与操作系统的两种状态(用户态和内核态)
- 首先我们要知道CPU有四种状态,分别为编号为0(特权最大)到3(特权最小),以及3个受保护的主要资源:内存、I/O端口和执行某些机器指令的能力。
- 操作系统它基于CPU之上,只用到了CPU的两种状态,一个内核态,一个用户态,内核态运行在CPU的第 0 等级,用户态运行在CPU的第 3 等级。
2.操作系统的用户态和内核态之间的切换
- 首先内核态与用户态是操作系统的两种运行级别,跟intel cpu没有必然的联系, intel cpu提供Ring0-Ring3三种级别的运行模式,Ring0级别最高,Ring3最低。
- 其次Linux使用了Ring3级别运行用户态,Ring0作为 内核态,没有使用Ring1和Ring2。Ring3状态不能访问
Ring0的地址空间
(这里存放在整个内核的代码和所有的内核模块,以及内核所维护的数据
)。
- 然后用户运行一个程序,该程序所创建的进程开始是运行在用户态的,如果要执行文件操作,网络数据发送等操作,必须通过write,send等系统调用(比如netty和redis中对于多路复用select和poll的改进epoll也需要切换到内核态),这些系统调用会调用内核中的代码来完成操作,这时,必须切换到Ring0,然后进入
内核地址空间
去执行这些代码完成操作,完成后,切换回Ring3,回到用户态。这样,用户态的程序就不能随意操作内核地址空间,具有一定的安全保护作用。
- 最后至于说保护模式,是说通过内存页表操作等机制,保证进程间的地址空间不会互相冲突,一个进程的操作不会修改另一个进程的地址空间中的数据。
3.操作系统的用户态切换到内核态的四种情况
4.用户代码和操作系统代码是如何在cup上面运行的
4.1操作系统运行用户程序?
- 计算机的代码,都是机器码,都由CPU一条一条地执行的,无论是应用程序的代码,还是操作系统的代码,都是机器码,CPU都用一样的方法来执行,这个问题和内核态还是用户态无关。所以,没有“操作系统运行用户程序”的说法。所有的软件指令,都被CPU用一样的方法执行。
4.2为什么同是代码,操作系统程序会比一般程序拥有更高的权限?
- 权限是CPU制造的,CPU只要能保证权限的穿越是单向的,就可以赋予操作系统(的代码)特殊的权限。比如ARM64 CPU启动的时候,(在特定的设计下),工作在权限EL1,这时开始执行的代码就是操作系统的代码了,操作系统执行够了以后,主动把CPU权限降低到EL0(EL1的时候你有权降级,但反过来你就没有权利),这之后执行的代码就在所谓的“用户态"了,由于CPU工作在EL0状态,这些代码的权限就很低,这时如果你执行一个权限比较高的指令(比如访问SCTLR_EL1.A寄存器,又比如x86的int,ARM的SC),CPU就会报错(报错的结果是把权限切换回EL1,并且直接调用操作系统设置好的代码,这样控制权仍是操作系统的),把用户程序的控制权强行取走,赋予给操作系统,这就是为什么操作系统(表现出来)比用户程序拥有更高的权限。
- 所谓操作系统,用户程序,系统服务,都是我们基于CPU权限人为制造的概念,并非必须存在的客观实体。
4.3代码是如何成为操作系统的?
- CPU开始加电了,完成内部必要的处理后,就可以从指定的内存地址开始执行代码,这个内存地址称为Reset向量,在一些CPU上是固定的,在一些CPU上是可以根据特定的条件变化的(比如把CPU连入电路的时候,给某个引脚加高电平等),但无论如何,反正最终CPU会在某个固定的位置开始执行程序。什么代码放在这里,什么代码就具有最高的执行权限。
- 在DOS+x86的时代,硬件设计者会在这个内存位置上固定焊一个ROM,然后在计算机出厂的时候,固定在这个ROM上烧一段程序,这个程序就称为BIOS,所以,CPU加电后,首先进入的是BIOS程序,然后有BIOS程序根据你是否有磁盘,从磁盘的指定位置上读入代码来执行。
- 所以你要成为操作系统,你就要把你的代码放到磁盘的指定位置,这样这个代码就会具备“操作系统”的控制权。
4.4现代的计算机CPU是如何加载操作系统代码的?
- 现代更复杂的计算机,硬件加电的时候,根本还没有给主CPU加电,而是某个MCU(小CPU)首先获得系统的控制权,这个MCU就可以直接设置固定的内存内的内容,让CPU到时执行这段代码,这样,其实真正具有系统的把控权的是这个MCU,它的代码才是系统的“固件”。
- 如果是多核CPU,CPU加电的时候仅启动一个核,完成前期的大部分初始化(比如安全操作系统和虚拟机调度器的初始化),然后进入EL1,完成主CPU的初始化,在这个主CPU初始化的时候,准备其他CPU的Reset向量的内容,完成准备后,控制硬件给其他CPU加电,这样其他CPU也在操作系统的控制下投入运行。整个系统就都在控制之下了。
</div>