CS 的 RPL 并不总是与符合代码段的 DPL 匹配。但它不应该总是与调用代码段的 DPL 匹配吗(控制转移的代码)?当我们从符合要求的代码段返回时,RPL 位会发生什么?那么 RPL 位是否等于符合代码段的 DPL?
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,并且段 A 中具有 DPL 3 的代码流入 B 并随后流入 C,则 CPL 为 3,即 A 的 DPL,即使调用者代码段 (B) 的 DPL 为 1。
基本上是一个符合要求的代码段调用另一个符合要求的代码段。
当我们从符合要求的代码段返回时,RPL 位会发生什么?那么 RPL 位是否等于符合代码段的 DPL?
我假设您的意思是 CPL 位,因为 CPU 永远不会触及 RPL 位。
当访问其他代码段时,使用了远调用或跳转(我们在这里忽略了其他机制,因为它们都等同于命名的两个),因此调用者CS
被保存在堆栈中(首先有或没有堆栈切换)并恢复如果仍然授予访问权限,则返回时。