4

我指的是Broken Thorn的操作系统开发教程。我目前正处于执行第二阶段引导加载程序以加载 GDT 并进入保护模式的阶段。

我了解 GDT 的工作原理以及如何进入保护模式。但是,我的困惑是加载cr0寄存器后执行的第一条指令:

jmp 08h:Stage3      ; far jump to fix CS. Remember that the code selector is 0x8!

此时,CS 尚未加载指向代码描述符的选择器值,我们已经处于保护模式。此 CS 值可能与用于执行实模式指令的值不同,因此添加 IP 的值也会导致地址与jmp. 那么这不会导致基于 CS 的值执行一些垃圾代码吗?还是我缺少什么?

4

1 回答 1

5

每个段选择器都有包含其实际基地址的影子部分。此隐藏部分在段加载指令期间更新。

这意味着在执行远跳转或其他一些指令加载之前cs,它仍然具有在实模式下设置的基地址,并且eip相对于它计算偏移量。

阅读:英特尔软件开发人员手册,第 3 卷,第 3 章。

于 2014-01-27T15:35:01.000 回答