- 段权限检查
DPL 是段的权限属性,要想访问一个数据段,段选择子和CPU当前权限必须高于DPL。
DPL:段的权限
RPL:段选择子的权限
CPL:CPU的权限,当前特权级
- CPL
CPL(Current Privilege Level) :当前特权级
CS和SS中存储的段选择子后2位.
3.DPL (Descriptor Privilege Level ) 描述符特权级别
DPL存储在段描述符中,规定了访问该段所需要的特权级别是什么。
通俗理解 :如果你想访问我,那么你应该具备什么特权。
举例说明:
Mov DS ,AX
如果AX 指向的段DPL= 0,当当前程序的CPL=3,这条指令会失败。
4.RPL (Request Privilege Level) 请求特权级别
RPL是段选择子的权限,每个段的选择子都有自己的RPL。
举例说明:
Mov ax,0008 与 Mov ax,000B //段选择子
Mov ds,ax Mov ds,ax //将段描述
指向的是同一个段描述符,但RPL是不一样的.
5.数据段权限检查
参考如下代码:
比如当前程序处于0环,也就是说CPL=0
Mov ax,000B //1011 RPL = 3
Mov ds,ax //ax指向的段描述符的DPL = 0
数据段的权限检查:
CPL <= DPL 并且 RPL <= DPL (数值上的比较)
当CPL =3,只能加载DPL=3的数据段。
当CPL=0,当RPL<= DPL的数据段都可以加载。
6. 练习
描述这下面代码的执行过程:
mov ax,0x23
mov ds,ax
段选择子是0x0023,RPL=11b=3,属于最低权限,只能访问DPL=3的数据段。而CPL则无影响,不管是0环还是3环,都满足CPL<=RPL,只要RPL满足,CPL也一定满足。
当执行 mov ds,ax 时,CPU先解析段选择子0023,然后去GDT表找段描述符,检查段描述符P位是否有效,然后检查S位,确认是数据段或代码段,然后检查TYPE域确认是数据段,然后看DPL是否等于3.只要上述条件都满足,则mov指令执行成功,只要有一条不满足,mov失败。