【发布时间】:2015-09-13 12:13:38
【问题描述】:
我正在尝试了解有关 intel x86 架构的一些细节。我还没有真正理解调用门机制,但是没有它, 对于访问不符合要求的代码段,它的 DPL 必须等于 CPL。
我明白这在 DPL CPL 的情况下是禁止的?我的意思是如果我们想保持相同的权限级别,CPL 可以在跳转后保持不变,如果我们想降低我们的权限,我们可以使用 RPL。
【问题讨论】:
标签: x86 intel memory-segmentation privilege
我正在尝试了解有关 intel x86 架构的一些细节。我还没有真正理解调用门机制,但是没有它, 对于访问不符合要求的代码段,它的 DPL 必须等于 CPL。
我明白这在 DPL CPL 的情况下是禁止的?我的意思是如果我们想保持相同的权限级别,CPL 可以在跳转后保持不变,如果我们想降低我们的权限,我们可以使用 RPL。
【问题讨论】:
标签: x86 intel memory-segmentation privilege
作为一般规则,当您直接访问代码段时,您只能对具有相同权限的段执行此操作。
这就是不合格代码段 (NCCS) 的用途。
Intel 也有利于引入一致性代码段 (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 和使用数据段一样,RPL 可以让您模拟一个特权较少的程序。
如果 CG 为 DPL=2(并且目标选择器也具有 DPL>=2)并且您的代码具有 CPL=0,则您可以选择以 CPL=3 的用户模式应用程序执行调用(因此无法获得访问权限)或作为 CPL=2 的内核组件(获得访问权限但无法调用其他更多特权代码段)。
【讨论】: