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

You*_*oui 3 x86 intel privilege memory-segmentation

我正在尝试了解有关intel x86架构的一些细节.我还没有真正理解调用门机制,但没有它,为了访问不符合代码段,它的DPL必须等于CPL.

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

小智 9

作为直接访问代码段的一般规则,您只能对具有相同权限的段执行此操作.
这就是使用非合格代码段(NCCS)的原因.
英特尔有利于引入符合代码段(CCS),可由较少特权的应用程序访问(如果内核需要共享某些代码而不提升调用者的权限).

直接访问代码段永远不会更改当前权限,目标代码的CPL是调用者的CPL.

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

规则是:

NCCS
1.调用者CPL必须等于描述符DPL(相同权限)2.无论选择器中使用何种RPL,目标代码都将以CPL等于调用者CPL运行.3.选择器RPL必须小于或等于呼叫者CPL.

CCS
1.调用者CPL必须大于或等于描述符DPL(权限较低)2.无论选择器中使用何种RPL,目标代码都将以CPL等于调用者CPL运行.

正如您所看到的,直接访问代码段不会更改CPL(并且没有堆栈更改).

要更改权限(CPL),英特尔推出了Call Gates.使用CG,与数据段一样,RPL允许您模拟权限较低的程序.
如果CG为DPL = 2(并且目标选择器也具有DPL> = 2)且您的代码具有CPL = 0,则可以选择以CPL = 3的用户模式应用程序执行调用(从而无法获得访问权限)或者作为CPL = 2的内核组件(获得访问但不可能调用其他更多特权代码段).