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

X86 将引导加载程序重新定位到EBDA?,x86,bootloader,bios,real-mode,X86,Bootloader,Bios,Real Mode,出于教育目的,我试图编写一个简单的x86引导加载程序,从软盘映像引导虚拟操作系统 我目前正处于通过BIOS视频中断让引导加载程序输出“Hello world”的阶段。现在,我想将引导加载程序重新定位到更高的内存地址,以便将操作系统映像加载到它当前所在的位置 现在我感到困惑的是:我正在阅读的教科书建议将引导加载程序(512字节大)重新定位到段0x9800,该段在段0xA000之前32KB。但据我所知,扩展BIOS数据区(EBDA)可以从地址0xA0000向下扩展到128 kB,不应被覆盖 那么我的

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

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

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

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

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

那么我的课本错了吗

是的,教科书错了

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

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


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

谢谢,这就把它清除了。但最低可用地址不应该是
0x500
?为什么不把引导加载程序放在那里开始呢?或者只是把引导加载程序加载到未使用的文本视频空间;-)@彼得:这方面也没有官方标准(但没有像
int0x12
这样的运行时测试)。拉尔夫·布朗(Ralph Brown)的中断列表(与其他列表一起提供——内存、IO端口、CMOS等)显示了0x00000500前后的一些内容(“打印屏幕状态”、“NEC PC-9800系列-屏幕模式”和一些基本ROM的内容),但你不能太确定更新的计算机(RBIL没有保持最新)。MS-DOS从0x00000600使用内存。所以这应该是安全的。将四舍五入到2的幂次方更好,“更安全”。出于其他原因,我通常会舍入到页面边界(0x000011000)。如果不希望从DOS RPL加载,则自定义操作系统不需要可选的RPL支持。