2

在 x86 中,在我们设置 PE 位 CR0 后,我们做一个 far JMP 以确保 CS/EIP 被改变。当我查看 x86 程序员手册中的逻辑流程时,对应于这条 far JMP 指令(保护模式),我看到如下内容:

Set RPL field of CS register to CPL;

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

4

1 回答 1

3

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

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

[...] 在执行 far JMP 之前,我是否应该确保 CS 具有符合此条件的某些值?

不,这无关紧要。从技术上讲,CPU 对来自段寄存器的值不感兴趣,而是对它们的影子寄存器(即“段描述符缓存”)感兴趣。这些影子寄存器包含 RPL、DPL、CPL、基地址以及段描述符中的其他内容。实模式中不需要的值(如 RPL)设置为适合实模式的值。当从实模式切换到保护模式时,实模式中不需要的值变为必需值,并使用从 GDT 获得的值进行初始化。当切换回实模式时,保护模式中相关的值再次变得无关紧要,从而获得特定的值1

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

有关此主题的更多信息,请阅读本文以及其中链接的论文。


1实际上,这并不完全正确。阅读虚幻模式

于 2015-10-20T10:20:37.933 回答