x86从实模式CPL切换到保护模式(当前特权级别)

x86从实模式CPL切换到保护模式(当前特权级别),x86,privileges,protected-mode,setjmp,real-mode,X86,Privileges,Protected Mode,Setjmp,Real Mode,在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中的最后两位。这意味着,在far JMP之前,CS应该包含一个最后两位为00的值。所以,当我最初

在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中的最后两位。这意味着,在far JMP之前,CS应该包含一个最后两位为00的值。所以,当我最初处于实模式时,我是否应该在执行far JMP之前确保CS具有符合此条件的值? 如果我换一种说法,当我们从实模式切换到保护模式时,CPL是什么

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

当实模式激活时,CPL被设置为一些适合实模式“需要”的值(我猜是零)。当跳转到保护模式时,它被分配段选择器的最低有效两位的值

[…]我是否应该确保CS具有符合此要求的某些值 执行far JMP之前的条件

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

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

有关此主题的更多信息,请阅读并阅读相关文章



事实上,那不完全是真的。阅读。

好问题,顺便说一句。当我开始做这件事时,几个月来我一直在想同样的事情。谢谢,cad。然而,我的脑袋在打转,你的回复中嵌入了太多嵌套的信息。我想我可能需要几个月的时间来消化它们。但在那之前我需要了解很多,因为我很快就会站在老师的讲台上。