在启动过程中,分别将中断向量表( IVT )和BDA(BIOS数据区)加载到内存中,IVT起始地址为0x00000000,BDA起始地址为0x00000400。
IVT 0x00000000 ~ 0x000003FF
BDA 0x00000400 ~ 0x000004FF不管硬件如何,这种情况总是这样吗?
更确切地说,
Q1。IVT起始地址总是设置为0x00000000吗?
Q2。IVT大小总是1024字节吗?
Q3。BDA的起始地址总是设置为0x00000400吗?
Q4。BDA大小总是256字节吗?
出现这些问题的原因是,例如,当在0x40E上检查地址指针(如EBDA(Extended Area) )时,以确保是否需要条件操作。
发布于 2019-08-22 04:14:45
Q1。IVT起始地址总是设置为0x00000000吗?
只适用于支持BIOS并使用BIOS引导的80x86系统。
Q2。IVT大小总是1024字节吗?Q3。BDA的起始地址总是设置为0x00000400吗?
在这些事情之间没有任何“硬性障碍”。IVT本身是1 KiB,但是各种条目(特别是接近尾端的条目)被用于BIOS数据,因此更像是IVT和BDA相互交织和重叠。
Q4。BDA大小总是256字节吗?
为了与旧DOS的内容兼容,BDA“应该”在0x00000500之前结束。但是,不能保证BIOS关心与旧DOS的兼容性。
一个更好(更谨慎/更保守)的想法是忽略内存的前4位KiB,直到操作系统的引导代码不再需要BIOS,然后将其视为免费可用的RAM (与EBDA不同,操作系统没有理由保存BDA中的数据)。
注意:即使启动代码仍然需要BIOS,也没有理由让引导代码读取BDA本身中的任何内容(它只需要避免破坏数据,这样BIOS就可以读取它)。例如,您可以只使用int 0x12 (或int 0x15, eax=0xE820),而不是查看0x040E。我看到人们使用BDA的唯一其他事情是确定软盘驱动器类型和串行端口的数量(这是BIOS设置中可能被用户设置错的东西,因此是不可靠和无用的)。
https://stackoverflow.com/questions/57601076
复制相似问题