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