访问代码段时的权限级别检查

Privilege level checking when accessing code segment

我正在尝试了解有关英特尔 x86 架构的一些细节。我还没有真正理解调用门机制,但没有它, 要访问不一致的代码段,它的 DPL 必须等于 CPL。

我知道这在 DPL < CPL 的情况下很重要,但为什么在 DPL > CPL 的情况下它被禁止?我的意思是,如果我们想保持相同的特权级别,CPL 可以在跳转后保持不变,如果我们想降低我们的特权,我们可以使用 RPL。

作为一般规则,当您直接访问代码段时,您只能对具有相同权限的段执行此操作。
这就是不一致代码段 (NCCS) 的用途。
Intel made 还引入了 Conforming Code Segment (CCS),它可以被 低权限 应用程序访问(以防内核需要在不提升调用者权限的情况下共享一些代码) .

直接访问代码段不改变当前权限,目标代码的CPL就是调用者的CPL

RPL 也没有任何作用。对于 CCS,它会被忽略,并且必须小于或等于 NCCS 的调用方 CPL(这可能是副作用)。

规则是:

NCCS
1.调用者CPL必须等于描述符DPL(相同权限) 2. 目标代码将是 运行,CPL 等于调用者 CPL,而不管选择器中使用的 RPL。 3.选择器RPL必须小于或等于调用者CPL。

CCS
1.调用者CPL必须大于或等于描述符DPL(特权较低) 2. 目标代码将是 运行,CPL 等于调用者 CPL,而不管选择器中使用的 RPL。

如您所见,直接访问代码段不会更改 CPL(也没有堆栈更改)。

要更改特权 (CPL),英特尔介绍了 呼叫盖茨 。与数据段一样,使用 CG,RPL 可以让您模拟 特权较低的 程序。
如果 CG 为 DPL=2(并且目标选择器也有 DPL>=2)并且您的代码有 CPL=0,您可以选择以 CPL=3 的用户模式应用程序执行调用(从而无法获得访问权限)或作为 CPL=2 的内核组件(获得访问权限但无法调用其他更高特权的代码段)。