首页 文章

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

提问于
浏览
3

我指的是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 回答

  • 4

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

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

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

相关问题