x86权限比较规则(CPL/DPL/RPL)

1、定义
x86架构下定义了4个特权级,分别是0~3。其中,0特权级最高,3特权级最低。

CPL:Current Privilege Level,当前特权级,由当前运行代码段段选择子CS.RPL位域决定;
DPL:Descriptor Privilege Level,描述符特权级,由待访问的数据段或代码段描述符的DPL位域决定;
RPL:Request Privilege Level,请求特权级,由待访问的代码段或数据段段选择子的RPL位域决定;

2、对数据段(DS)或堆栈段(SS)访问的权限检查规则
要求CPL ≤ DPL,同时RPL ≤ DPL。
即:只有相同或更高特权级的代码才能访问相应的数据段。注意,1)RPL可能会削弱CPL的作用。访问数据段或堆栈段时,默认用CPL和RPL中的最小特权级去访问数据段,所以max {CPL, RPL} ≤ DPL,否则访问失败,产生#GP异常。 2)对数据段或堆栈段的访问不会改变CPL。

3、对代码段(CS)访问的权限检查规则
由 jmp/call/ret 导致的代码跳转,如果是段内跳转(短跳转),则不进行权限检查;如果是段间跳转(远跳转),则需要进行权限检查。涉及4种类型的检查,分别是CPL、DPL、RPL和Conforming flag。

【补充:关于一致性代码段和非一致性代码段】
1)一致性代码段:
简单理解,就是操作系统拿出来被共享的代码段,可以被低特权级的用户直接调用访问的代码。
通常这些共享代码,是"不访问"受保护的资源和某些类型异常处理。比如一些数学计算函数库,为纯粹的数学运算计算,被作为一致代码段。
2)非一致性代码段
为了避免低特权级的访问而被操作系统保护起来的系统代码。

3.1 访问一致性代码段
要求CPL ≥ DPL,不检查RPL。
即:低特权级的代码可以访问高特权级的代码,但CPL保持不变。这是唯一的CPL和DPL可以不相等的情况。

3.2 访问非一致性代码段
要求CPL = DPL,同时RPL ≤ CPL。CPL保持不变。

3.3 通过门描述符进行的代码跳转
1)调用门 call gates;
2)陷阱门 trap gates;
3)中断门 interrupt gates;
4)任务门 task gates;【不使用】

3.3.1 调用门的权限检查规则:
在这里插入图片描述
1)对于一致性代码,如之前描述,跳转前后CPL保持不变;
2)对于 jmp + 调用门,只有CPL = 目标代码段描述符DPL时,才跳转成功。因而跳转前后,CPL也保持不变;
3)对于 call + 调用门,CPL = 目标代码段描述符DPL时,跳转前后CPL保持不变;CPL > 目标代码段描述符DPL时,跳转后CPL = 目标代码段描述符DPL,CPL发生变化;

由此可见,这是我们目前唯一见到的CPL发生变化的跳转方法,即用CALL + 调用门方式跳转,且目标代码段是非一致代码段。

3.3.2 陷阱门和中断门的权限检查规则
“When responding to an exception or interrupt, the processor uses the exception or interrupt vector as an index to a descriptor in the IDT. If the index points to an interrupt gate or trap gate, the processor calls the exception or interrupt handler in a manner similar to a CALL to a call gate ”
由此可见,陷阱门和中断门的权限检查规则和上述 call + 调用门一致。

4、ret返回指令的权限检查规则
1)段内返回(near return),不检查权限;
2)同等级权限的段间返回(far return),进行权限检查;
3)不同等级权限的段间返回(far return),进行权限检查。只允许从高等级权限返回至低等级权限,即要求返回目标代码段描述符DPL > CPL。

ret指令通过比较栈中保存的CS.RPL位域和CPL,从而确认是否需要特权等级变化。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值