2015-10-20 130 views
2

在x86中,在设置PE位CR0后,我们执行远程JMP以确保CS/EIP已更改。当我看到在x86的程序员手册中的逻辑流程,与此对应远JMP指令(保护模式),我看到这样的事情:x86从实模式切换到保护模式CPL(当前权限级别)

Set RPL field of CS register to CPL; 

我想,以确保优先级为0。假设是DPL描述符中也是0,远端JMP中的选择器中的RPL也是0.描述符中的C位为0,所以它是非符合代码段的情况。该手册说CPL是CS中的最后两位。这意味着,在远的JMP之前,CS应该包含一个最后两位为00的值。因此,当我最初处于实模式时,我应该确保CS在I之前具有符合此条件的某个值执行远远的JMP? 如果我要重述一下,当我们从实模式切换到保护模式时,CPL是多少?

+1

不错的问题,顺便说一句。当我开始使用这些东西的时候,我想了好几个月。 – Downvoter

+0

谢谢,cad。尽管如此,我的脑袋正在旋转着,在你的回复中嵌入了如此多的嵌套信息。我想这可能需要我花几个月的时间来吸收它们。但在此之前我需要了解很多,因为我很快就会登上老师的领奖台。 – Kamalakshi

回答

3

[...]当我们从真实模式切换到保护模式时,CPL是多少?

当真实模式处于活动状态时,CPL被设置为适合真实模式(我猜测它为零)的“需求”的某个值。当跳转到保护模式时,它被分配了段选择器的最低有效两位的值。

我应该在执行远端JMP之前确保CS的某些值符合此 条件吗?

不,这是无关紧要的。从技术上讲,CPU对分段寄存器的值不感兴趣,但它们的影子寄存器"segment descriptor caches."这些影子寄存器包含RPL,DPL,CPL,基地址以及段描述符中的其他内容。实模式中不需要的值(如RPL)被设置为适合实模式的值。从实模式切换到保护模式时,实模式中不需要的值变得必要,并且使用从GDT获得的值进行初始化。当切换回实模式时,与保护模式相关的值再次变得无关紧要,从而得到指定的具体值。

毕竟,CPU直接从段描述符缓存中读取,而不是从段寄存器中读取。

有关该主题的更多信息,请阅读this及其链接的论文。


其实,这是不完全正确。阅读关于Unreal Mode