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

标签 x86 bootloader bios real-mode

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

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

现在我很困惑:我正在阅读的教科书建议将引导加载程序(512 字节大)重新定位到分段 0x98000xA000 之前 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/

相关文章:

c - 优化简单的模具操作,将变量保存在寄存器中

assembly - 如何将第9扇区复制到第1扇区?

bootloader - 如何持久保存U-Boot环境变量?

使用 open watcom 为 286 cpu 编译引导加载程序

multithreading - 例如,在解决进餐哲学家的问题时,是否有一种方法可以在DOS中模拟多线程?

c - 水平翻转 1bpp .bmp 图像

linux - 如何在不知道 EFI 系统表的情况下查找 MCFG 表?

linux - dmidecode 从哪里获取 SMBIOS 表?

assembly - 是否可以在 x64 操作系统上运行 x86 程序集?

python - 类似 BIOS 的交互式菜单,适用于基于 Python 文本的游戏