X86 将引导加载程序重新定位到EBDA?
出于教育目的,我试图编写一个简单的x86引导加载程序,从软盘映像引导虚拟操作系统 我目前正处于通过BIOS视频中断让引导加载程序输出“Hello world”的阶段。现在,我想将引导加载程序重新定位到更高的内存地址,以便将操作系统映像加载到它当前所在的位置 现在我感到困惑的是:我正在阅读的教科书建议将引导加载程序(512字节大)重新定位到段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,不应被覆盖 那么我的
0x9800
,该段在段0xA000
之前32KB。但据我所知,扩展BIOS数据区(EBDA)可以从地址0xA0000
向下扩展到128 kB,不应被覆盖
那么我的课本错了吗?我是否应该将引导加载程序移到段0x7800
(如果EBDA较小,则移到更高的位置)
现在我感到困惑的是:我正在阅读的教科书建议将引导加载程序(512字节大)重新定位到段0x9800,该段在段0ax000之前32KB。但据我所知,扩展BIOS数据区(EBDA)可以从地址0xa0000向下扩展到128 kiB,不应被覆盖
那么我的课本错了吗
是的,教科书错了
第二个最佳选择是使用int0x12
来确定可以安全使用的内存量;然后将引导加载程序重新定位到“最高安全地址”(并使用分段,这样它工作起来就不会有太多麻烦,因为无论您需要如何设置cs
/最好的方法是将引导加载程序重新定位到最低的地址(例如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支持。