我正在开发一个遵循多重引导规范的简单内核。这是一个类项目,所以我不能直接发布我的代码,但对于我的问题,说我们使用的是multiboot 示例代码的修改版本就足够了。
我正在尝试将全局描述符表寄存器(GDTR)设置为指向适当的地址。为此,我一直在关注 OSDev wiki 中的GDT 教程。在本教程中,他们的平面保护模式示例代码只是从堆栈中加载两个值并将它们放入 GDTR。这让我很困惑,因为我认为应该在初始化堆栈之前设置 GDTR。如果内核还没有初始化它,我不知道 ESP 会指向哪里。我想 GRUB 有可能在跳转到 boot.S 中的任何代码之前将其设置为某个值,但我无法找到任何文档来建议这一点。
tl;dr - 为什么OSDev GDT 教程在加载全局描述符表的地址和大小时从相对于 ESP 的地址检索数据?