段描述符属性DB位,段权限检查

描述符属性:DB位
情况一:对CS段的影响
D = 1 采用32位寻址方式
D = 0 采用16位寻址方式
前缀67 改变寻址方式
 
情况二:对SS段的影响
D = 1 隐式堆栈访问指令(如:PUSH POP CALL) 使用32位堆栈指针寄存器ESP
D = 0 隐式堆栈访问指令(如:PUSH POP CALL) 使用16位堆栈指针寄存器SP
 
情况三:向下拓展的数据段
D = 1 段上线为4GB
D = 0 段上线为64KB
CPL(Current Privilege Level) :当前特权级
cs:段后两位称为CPL:当前特权级,可以理解为当前程序它的特权级是什么
注意:cs和ss段选择子后两位永远都是相同的
 
DPL(Descriptor Privilege Level) 描述符特权级别
DPL存储在段描述符中,规定了访问该段所需要的特权级别是什么,通俗的理解为如果你想访问我,那么你应该具备什么特权.
 
RPL(Request Privilege Level) 请求特权级别
RPL是针对段选择子而言的,每个段的选择子都有自己的RPL。
 
数据段的权限检查
参考如下代码:
比如当前程序处于0环,也就是说cs段寄存器后两位为0,CPL=0
 
Mov ax,000B    //1011  段选择子后四位为11 ,RPL = 3
Mov ds,ax    //ax指向的段描述符的DPL = 0
Mov ax,000B //1011 段选择子后四位为11 ,RPL = 3 Mov ds,ax //ax指向的段描述符的DPL = 0
 
数据段的权限检查:
CPL <= DPL 并且 RPL <= DPL (数值上的比较)
只有当CPL和RPL都小于等于DPL的时候,数据段的赋值才会成功
 
注意:代码段和系统段描述符中的检查方式并不一样
 
总结:
CPL CPU当前的权限级别
DPL 如果你想访问我,你应该具备什么样的权限
RPL 用什么权限去访问一个段
 
为啥要有RPL?
本可以用“读 写”的权限去打开一个文件,但为了避免出错,有些时候我们使用“只读”的权限去打开
 
posted @ 2020-05-04 20:20  拂树若生花  阅读(267)  评论(0编辑  收藏  举报