我指的是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的值执行一些垃圾代码吗?或者有什么我想念的东西?
答案 0 :(得分:4)
每个段选择器都有包含其实际基址的阴影部分。在段加载指令期间更新此隐藏部分。
这意味着在远程跳转或其他一些指令加载cs
之前,它仍然具有在实模式下设置的基址,并且相对于它计算了eip
偏移量。
阅读:Intel Software Developer Manual,第3卷,第3章。