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

时间:2015-06-26 13:47:37

标签: x86 intel memory-segmentation privilege

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

我确实理解在DPL< CPL,但为什么在DPL的情况下> CPL是禁止的吗?我的意思是如果我们想保持相同的权限级别,CPL可以在跳转后保持不变,如果我们想降低我们的权限,我们就可以使用RPL。

1 个答案:

答案 0 :(得分:7)

作为一般规则,当您直接访问代码段 时,您只能对具有相同权限的段执行此操作。
这就是使用不合格代码段(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),英特尔推出了呼叫门。使用CG,与数据段一样,RPL允许您冒充较少特权程序。
 如果CG为DPL = 2(并且目标选择器也具有DPL> = 2)并且您的代码具有CPL = 0,则可以选择以CPL = 3的用户模式应用程序执行调用(从而无法获得访问权限)或者作为CPL = 2的内核组件(获得访问权限,但无法调用其他更多特权代码段)。