我试图了解有关英特尔 x86 架构的一些细节。我还没有真正理解调用门机制,但是没有它,为了访问不符合要求的代码段,它的 DPL 必须等于 CPL。
我明白这在 DPL < CPL 的情况下很重要,但为什么在 DPL > CPL 的情况下它是被禁止的?我的意思是如果我们想保持相同的特权级别,CPL 可以在跳转后保持不变,如果我们想降低我们的特权,我们可以使用 RPL 。
我试图了解有关英特尔 x86 架构的一些细节。我还没有真正理解调用门机制,但是没有它,为了访问不符合要求的代码段,它的 DPL 必须等于 CPL。
我明白这在 DPL < CPL 的情况下很重要,但为什么在 DPL > CPL 的情况下它是被禁止的?我的意思是如果我们想保持相同的特权级别,CPL 可以在跳转后保持不变,如果我们想降低我们的特权,我们可以使用 RPL 。
作为一般规则,当您直接访问代码段时,您只能对具有相同权限的段执行此操作。
这就是不合格代码段 (NCCS) 的用途。
英特尔也有利于引入一致性代码段(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),英特尔引入了Call Gates。与 CG 一样,与 Data Segments 一样,RPL 让您可以模拟一个特权较低的程序。
如果 CG 为 DPL=2(并且目标选择器也具有 DPL>=2)并且您的代码具有 CPL=0,则您可以选择以 CPL=3 的用户模式应用程序执行调用(因此无法获得访问权限)或作为 CPL=2 的内核组件(获得访问权限但无法调用其他更多特权代码段)。