最近,当我读到《计算机组织与设计:硬件/软件接口”。Patterson和John L. Hennessy,它引用了一个资源[Robin和Irvine,2000],其中它谈到了在 * 虚拟化 * 上下文中使用段寄存器的pop指令。
Robin的论文引用了英特尔的文档,其中提到了两个例外:
如果SS寄存器正在加载,并且段选择器的RPL和段描述符的DPL不等于CPL。
如果正在加载DS、ES、FS或GS寄存器,并且指向的段是数据段或不符合代码段,但RPL和CPL均大于DPL。
而且从文档中的“操作”部分,SS需要通过“或段选择器的RPL = CPL”和“或DPL = CPL”的严格相等关系
而在Wikipedia中,它说DPL,RPL和CPL之间的关系检查与上述略有不同:
max(CPL,RPL)≤ DPL
英特尔文档还说明了这三个PL存储在figure 5-4中的位置。
Q:为什么SS(stack segment)需要CPL等于其他两个?其他像“DS,ES”不需要(即. CPL可以小于DPL,并且CPL中的较高特权级别可以在符合段中访问较低DPL)。
1条答案
按热度按时间lztngnrs1#
我认为这可能更像是哲学而不是技术。
DPL > CPL/RPL出现在内核代码访问“属于”特权较低的进程的内存(例如:阅读或写入系统调用的数据)。但是没有充分的理由将内核堆栈放置在属于低特权代码的段中;这将是荒谬,而且可能是一个安全漏洞。您的堆栈是您自己的数据,而不是其他任何人的数据。
因此,从这个Angular 来看,架构设计者可以假设,试图加载这样的SS一定是一个bug的结果,因此应该拒绝异常。