出于教育目的,我正在尝试编写一个简单的 x86 引导加载程序,用于从软盘镜像引导虚拟操作系统。
我目前正处于让引导加载程序通过 BIOS 视频中断输出“Hello world”的阶段。我现在想将引导加载程序重新定位到更高的内存地址,以便我可以将操作系统镜像加载到它当前所在的位置。
现在我很困惑:我正在阅读的教科书建议将引导加载程序(512 字节大)重新定位到分段 0x9800
段 0xA000
之前 32 kB 。但据我了解,扩展 BIOS 数据区 (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,所有代码/数据偏移量都保持不变/ds
段)。
请注意,对于 EBDA 的大小并没有官方限制。最接近官方限制的是 PXE 规范(用于网络启动),该规范规定 PXE 固件/ROM 可以占用 0x00080000 处的内存(并使 EBDA 更大,以便操作系统/启动加载程序不会践踏该内存)。考虑到这一点;您可以假设低于 0x00080000 的内存可以“相对安全”地使用,无需检查。
最好的方法是将引导加载程序重新定位到最低地址(例如 0x00000800),这样您就不必担心稍后才知道哪些是/不可用的 RAM(不要忘记“稍后”您)无论如何,可能会使用“int 0x15, eax=0xE820
”来获取完整的内存映射。
关于x86 - 将引导加载程序重新定位到 EBDA 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64817723/