CS的RPL并不总是与符合规范的代码段的DPL匹配。但它不应该总是匹配调用代码段的DPL(控件转移的代码)?当我们从符合规范的代码段返回时,RPL位会发生什么?那么RPL位是否等于符合代码段的DPL?
答案 0 :(得分:1)
首先修改了一些术语:
RPL(请求的权限级别)是每个段选择器的位0和1。
CPL(当前特权级别)是段寄存器 CS
的位0和1。
DPL(描述符权限级别)是控制其保护的段描述符中的两个位。
由于段寄存器保持段选择器,因此可能会有一些混乱,因此它们也有RPL
但是,我们必须排除CS
,因为我们无法直接进入它 - 我们只能通过特定说明进行更改。
这个想法是在访问数据段时使用RPL来降低CPL:当RPL可以被任何应用程序自由编辑时,CPU将使用RPL和CPL之间最严格的限制(实际上是两个之间的最大值) 。
当访问代码段时,RPL几乎没有影响(调用门的使用与数据段相同,不符合的段必须是RPL< = CPL并且符合代码段,它被忽略)和规则设置CPL取决于所使用的段的指令和类型。
CS的RPL并不总是与符合规范的代码段的DPL匹配。
因此CS
没有RPL,它有CPL,其余的是真实的,如英特尔SDM所证实的那样:
<强> 5.8.1.2 强>
当程序控制转移到符合规范的代码段时,CPL不会改变,即使DPL为 目标代码段小于CPL。这种情况是CPL可能不同的唯一情况 来自当前代码段的DPL。此外,由于CPL没有改变,因此不会发生堆栈切换。
这句话也回答了你的第一个问题
但是它不应该总是与调用代码段的DPL(控件转移的代码)相匹配吗?
不,如果代码段B和C分别符合DPL 1和0,并且带有DPL 3的段A中的代码流入B并随后流入C,则CPL为3,即A的DPL,即使调用者代码段(B)具有DPL 1。
基本上是一个符合规范的代码段,调用另一个符合规范的代码段。
当我们从符合规范的代码段返回时,RPL位会发生什么?那么RPL位是否等于符合代码段的DPL?
我假设您的意思是CPL位,因为CPU从未触及RPL位
当访问其他代码段时,使用远调用或跳转(我们忽略了其他机制,因为它们都等同于两个命名),因此调用者的CS
保存在堆栈(首先是否有堆栈交换机),如果仍然允许访问,则在返回时恢复。