CPU特权级别(R0 R3) 内核态与用户态总结

问题:

内核态和用户态的区别不是在于能够访问的内存范围不一样嘛,内核态能访问所有内存空间。 然后,进程执行的时候可以通过系统调用来切换到内核态。 这个切换,到底是个什么概念?? CPU做的事情不就是取指执行嘛,那么什么叫做“CPU切换到内核态呢”??

解答:

CPU是有内核栈的概念的
以linux为例
CPU有256个字节的内核栈
就是CPU会跳到一段预设地址
比如你说的系统调用,CPU遇到 INT 0x80的中断请求的时候,就会切换CPU的状态,到内核态,也就是跳到系统调用的处理入口
内核态里面是有内核栈的,像基地址ebp,跟栈指针esp,这些都跟跳转之前的用户栈 的值不一样了

其实这个跟异常是很像的,如果访问一个不可访问的地址,这个异常是怎么处理的呢

比如0xffffffff 这个地址,CPU读取指令,发现要访问这个地址,而又访问不了,那么就会跳到异常处理的地方(也是一段预设地址),然后执行,把异常返回

其实跳转到内核态这个,也是CPU在取指执行呀

系统调用的指令所在的位置,是在内核的内存里面,所以CPU才要切换到内核态,才能访问。

我们用户程序执行指令的时候,CPU会读取这些指令,然后其中有一个数据段选择器(它包含我们比较熟悉的寄存器ss 堆栈寄存器,ds数据段寄存器)

然后这两个寄存器里面,有告诉CPU 你只能在哪个权限范围内执行指令
其实就是告诉CPU 哪些指令不能执行(内核指令),哪些地址不能访问(不属于当前程序的内存地址)。

其实就是在给CPU限制权限,也就是我们说的CPU权限。

执行用户态指令的时候,CS寄存器里面的CPL字段表明当前是用户态(也叫ring3)权限,执行内核指令的时候,CS寄存器里面的CPL字段表示当前是内核态(ring0)