如果一个程序已经给他分配了他的代码段,数据段,堆栈段,这个是执行到一条指令,突然要访问,另一个程序的的地址,这个时候对于其他程序来说就是不安全的,或者说他这个时候去访问操作系统的地址,程序之间不能胡乱访问,如果操作系统的内存被更改了,有可能整台计算机都会崩溃。所以这个时候就需要提供一种机制保证,Intel 提供了一种模式就是保护模式。
注意:保护模式是在设计32位CPU时提出的。并不是16CPU支持的。
Intel 为保护模式提供了如下实现:
- 特权级
特权级分为 0 - 3 个级别,0 是最高级别,依次变低,而Linux内核也只是用 0 和 3 两种状态。
RPL:程序对段访问的请求权限,意思是当前进程想要的请求权限
CPL:是一种特殊的RPL,当前正在执行的代码所处的特权级
DPL:代码本身真正的特权级
- 段检查:
怎么对这三个值进行比较是否满足权限可以访问呢?
而这里是需要注意一个
Noncon forming Code Segment:非一致性代码段
Conforming Code Segment:一致代码段
数据段一定是非一致性代码段。
一般段都是非一致性代码段,需要被校验。
非一致性代码的规则如下:
只能在同一级别间相互访问
假设 CPL = 3,RPL = 3 ,DPL = 2
DPL 为目标可访问的权限码。CPL 当前程序的权限码,RPL 当前程序请求的权限码。
CPL 和 RPL 中取得最大值,然后和DPL进行比较,当前不相同,则抛出异常。
假设 CPL = 2,RPL = 2,DPL = 2
CPL 和 RPL 中取得最大值,然后和DPL进行比较,当前相同,则允许访问。
一致性代码的规则如下:
允许被同等级或低等级代码调用