【问题标题】:OS development - executing first instruction in protected mode操作系统开发 - 在保护模式下执行第一条指令
【发布时间】:2014-02-18 12:31:44
【问题描述】:

我指的是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 的值执行一些垃圾代码吗?还是我缺少什么?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 文档说影子寄存器用于保存描述符的实际值(基地址、限制、访问位等)。因此,所有这些都是在我执行 jmp 之前加载的。现在将 eip 的值添加到基地址可能会导致与 jmp 不同的地址,不是吗?
    • @Cygnus 有什么不同呢? movcr0 已在地址 (shadow cs base address + eip) 处执行,因此 eip 递增以指向代码中的下一条指令 jmp。由于shadow cs base address 没有改变(因为没有执行cs 加载指令)jmp 确实是接下来要执行的指令-)
    • 是的,我现在明白了。但是,实模式下影子寄存器的内容是什么?因为要执行 jmp(将处于保护模式),处理器将检查影子寄存器中的访问权限和段限制,这与实模式下的值相同?
    • @Cygnus limit = 0xffffflags = present, r/w, accessedbase = cs<<4。英特尔 SDM,第 3 卷,第 3 章。 9 和 20。
    猜你喜欢
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 2019-03-15
    • 2019-08-10
    • 2019-06-20
    • 2021-08-02
    • 2016-11-28
    • 1970-01-01
    相关资源
    最近更新 更多