特权级
也就是描述符中的DPL(实模式与保护模式)
作用:
在进行内存访问时(保护模式下的内存访问),用于控制操作或者限制访问性,其实也就是满足了特权级的转换规则,才允许操作,不然就是不合法的内存访问。
概述:
特权级分为4级:
特权级级别 | 通常归属的对象 |
---|---|
0 | 操作系统 |
1 | 系统服务程序 |
2 | 系统服务程序 |
3 | 普通用户程序 |
P.S.就是因为分 了4个级,因此描述符中需要2bit来表示
当然这也只是大概的分类,没有硬性要求,如果不想使用特权级机制,可以把所有段描述符的特权级都设为0
分类:
DPL:段描述符自身的特权级
CPL:当前特权级(当前执行的代码所属的特权级)
RPL:请求特权级,就是发生内存访问时(保护模式下的内存访问),访问之前的代码段的特权级为请求特权级
例子:
有两个段描述符A、B,它们分别都具有自己的DPL,A的DPL是0,B的特权级3,当前正在执行的段为A,因此CPL为0,然后A访问B,访问之后,现在正在执行的代码段为B,因此CPL变为3,而现在RPL为0.
特权级检查规则(保护机制)
1.将控制直接转移到非依从的代码段,要求当前特权级(CPL)和请求特权级(RPL)都等于目标代码段描述符的DPL
在数值上表示为:
CPL = 目标代码段描述符的DPL
RPL = 目标代码段描述符的DPL
2.将控制直接转移到依从的代码段,要求CPL和RPL都低于或者等于目标代码段描述符的DPL
在数值上为:
CPL >= 目标代码段描述符的DPL
RPL >= 目标代码段描述符的DPL
3.高特权级别的程序可以访问低特权级别的数据段,但低特权级别的不能访问高特权级别的数据段
在数值上为:
CPL <= 目标代码段描述符的DPL
RPL <= 目标代码段描述符的DPL
4.任何时候,栈段的特权级别必须和CPL相同
在数值上为:
CPL = 目标代码段描述符的DPL
RPL = 目标代码段描述符的DPL
特权级之间的访问方法
1.同级之间可以相互访问
直接可以相互访问
2.低级访问高级
2.1将高特权级的代码段定义为依从的(实模式与保护模式):
要求:CPL必须低于或者等于目标代码段描述符的DPL。
特点:依从的代码段不是在它的DPL上运行,而是在调用者的DPL上运行
2.2使用调用门:
使用方法:使用jmp far或者call far
特点:
1.jmp far:不改变CPL
2.call far:CPL会提升到目标代码段的DPL
要求:当前特权级CPL必须低于或者等于目标代码段描述符的特权级DPL
3.高级访问低级(代码段)
使用调用门:
使用方法:使用jmp far或者call far
特点:
1.jmp far:不改变CPL
2.call far:CPL会提升到目标代码段的DPL
要求:当前特权级CPL和请求特权级RPL都必须高于或者等于目标代码段描述符的特权级DPL
在数值上:
CPL >= 目标代码段描述符的DPL
RPL >= 目标代码段描述符的DPL
总结
其实,特权级也就和read、write属性的作用差不多,内存访问之前,检测访问是否合法,然后该怎样就怎样做。
本质上,都是用来加强分段机制的安全性。
++++++++++++++++++++++++++++++++++++++++++++++
更新:
看到上面的特权级的介绍就感觉挺麻烦的,对的!是非常非常麻烦,当使用特权级机制后,代码比没有用特权级机制,要复杂好多好多。。。