将引导加载程序重新定位到 EBDA?

Relocating bootloader into EBDA?

出于教育目的,我正在尝试编写一个简单的 x86 引导加载程序,从软盘映像引导虚拟 OS。

我目前正处于让引导加载程序通过 BIOS 视频中断输出“Hello world”的阶段。我现在想将引导加载程序重新定位到更高的内存地址,以便我可以将 OS 图像加载到它当前所在的位置。

现在这是我感到困惑的地方:我正在阅读的教科书建议将引导加载程序(512 字节大)重新定位到段 0x9800,即段 0xA000 之前的 32 kB。但据我所知,Extended BIOS Data Area (EBDA) 最多可以从地址 0xA0000 向下扩展 128 kB,不应被覆盖。

所以我的课本错了吗?我是否应该将引导加载程序移动到 0x7800 段(如果 EBDA 较小,则移动到更高一点)?

Now here is where I am confused: the textbook I am reading suggests to relocate the bootloader (which is 512 bytes large) to segment 0x9800 which is 32 kB before segment 0ax000. But as far as I understand, the Extended BIOS Data Area (EBDA) can extend up to 128 kiB down from address 0xa0000 and should not be overwritten.

So is my textbook wrong?

是的,教材错了

第二个最佳选择是使用 int 0x12 来确定您可以安全使用多少内存;然后将引导加载程序重新定位到“最高安全地址”(并使用分段,这样它就可以正常工作,因为无论您需要如何设置 cs/[,所有 code/data 偏移量都保持不变=12=] 段)。

请注意,EBDA 的大小没有官方限制。最接近官方限制的是 PXE 规范(用于网络启动),它说 PXE firmware/ROM 可以在 0x00080000 处占用内存(并使 EBDA 更大,这样 OS/boot 加载程序就不会践踏那段记忆)。考虑到这一点;您可以假设 0x00080000 以下的内存可以“相对安全地”使用而无需检查。

最好的方法是将引导加载程序重新定位到最低地址(例如 0x00000800),这样您就不必担心以后再弄清楚哪些 is/isn 不可用的 RAM(不要忘记“稍后”您可能会使用“int 0x15, eax=0xE820”来获取完整的内存映射。