在x86中,在我们设置PE位CR0之后,我们做了一个远JMP以确保CS / EIP被更改。当我查看x86程序员手册中的逻辑流程时,对应于这个远JMP指令(保护模式),我看到类似这样的内容:
Set RPL field of CS register to CPL;
我想确保权限级别为0.假设描述符中的DPL也为0,远JMP中选择器中的RPL也为0.描述符中的C位为0,因此它是非协调代码段案件。手册说CPL是CS中的最后两位。这意味着,在远JMP之前,CS应该包含一个最后两位为00的值。所以,当我最初处于实模式时,我应该确保CS有一些符合这个条件的值在我执行far JMP之前? 如果我改写一下,当我们从真实模式切换到保护模式时,CPL是什么?
答案 0 :(得分:3)
[...]当我们从真实模式切换到保护模式时,CPL是什么?
将CPL设置为适合某些值"需求"当实模式处于活动状态时,实模式(我猜它为零)。跳转到保护模式时,它会分配段选择器的最低有效位的值。
[...]我应该确保CS有一些符合此值的值 在执行far JMP之前的条件?
不,这无关紧要。从技术上讲,CPU对段寄存器的值不感兴趣但它们的影子寄存器"segment descriptor caches."这些影子寄存器包含RPL,DPL,CPL,基址以及段描述符中的其他内容。实模式中不需要的值(如RPL)设置为适合实模式的值。从实模式切换到保护模式时,实模式中不需要的值变得必要,并使用从GDT获得的值进行初始化。当切换回实模式时,保护模式中的相关值将再次变得无关紧要,从而获得指定的特定值 1 。
毕竟,CPU直接从段描述符缓存中读取,而不是从段寄存器中读取。
有关此主题的更多信息,请阅读this及其中链接的论文。
1 实际上,这并不完全正确。阅读Unreal Mode。