我指的是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的值执行一些垃圾代码?还是我缺少什么?
每个段选择器都有一个包含其实际基地址的阴影部分。该隐藏的部分在段加载说明中进行了更新。
这意味着在执行远跳转或其他指令加载之前cs
,它仍然具有设置为实模式的基地址,并且eip
相对于其计算偏移量。
阅读:英特尔软件开发人员手册,第3卷,第3章。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句