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



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

我目前正处于这样的阶段:我已经得到了我的引导加载程序;你好世界"通过BIOS视频中断。我现在想将引导加载程序重新定位到更高的内存地址,这样我就可以将操作系统映像加载到它当前所在的位置。

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

那么我的课本错了吗?我应该将引导加载程序移到段0x7800(如果EBDA较小,则移得更高一点(吗?

现在我感到困惑的地方是:我正在阅读的教科书建议将引导加载程序(512字节大(重新定位到0x9800段,该段在0#x000段之前为32 kB。但据我所知,扩展BIOS数据区(EBDA(可以从地址0xa0000向下扩展128 kiB,不应该被覆盖。

那么我的课本错了吗?

是的,课本错了。

第二个最好的选择是使用int 0x12来确定您可以安全使用多少内存;然后将引导加载程序重新定位到";最高安全地址";(并使用分段,这样它就不会有太多麻烦,因为无论需要如何设置cs/ds段,所有的代码/数据偏移量都保持不变(。

请注意,EBDA的大小没有官方限制。最接近官方限制的是PXE规范(用于网络引导(,该规范规定PXE固件/ROM可以占用0x00080000的内存(并使EBDA更大,这样OS/引导加载程序就不会践踏内存(。考虑到这一点;你可以假设低于0x00080000的内存可以被使用";相对安全";无需检查。

最好的方法是将引导加载程序重新定位到最低地址(例如0x00000800(,这样您就不必担心以后才知道什么是/不可用的RAM(不要忘记,"以后"您可能会使用"int 0x15, eax=0xE820"来获得完整的内存映射(。

最新更新