OS开发 - 在保护模式下执行第一条指令

时间:2014-01-27 15:27:37

标签: assembly operating-system bootloader osdev protected-mode

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

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

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

此时,CS尚未加载指向代码描述符的选择器值,并且我们已处于保护模式。该CS值可以与用于执行实模式指令的值不同,因此,添加IP的值也将导致与jmp的地址不同的地址。那么这不会导致基于CS的值执行一些垃圾代码吗?或者有什么我想念的东西?

1 个答案:

答案 0 :(得分:4)

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

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

阅读:Intel Software Developer Manual,第3卷,第3章。