IVT 和 BDA 物理内存地址和大小在引导序列期间设置是否始终相同?

Are IVT and BDA physical memory addresses and sizes set always the same during boot sequence?

在启动过程中,IVT(Interrupt Vector Table)和BDA(BIOS Data Area)被加载到内存中,IVT起始地址为0x00000000,BDA起始地址为0x00000400。

IVT 0x00000000 ~ 0x000003FF
BDA 0x00000400 ~ 0x000004FF

无论硬件如何,都是这样'always'吗?

更具体地说,

Q1。 IVT 起始地址是否始终设置为 0x00000000?

Q2。 IVT 大小总是 1024 字节吗?

Q3。 BDA 起始地址是否始终设置为 0x00000400?

Q4。 BDA 大小总是 256 字节吗?

之所以会出现这些问题,是因为例如在检查0x40E处的EBDA(Extended BIOS Data Area)等地址指针时,要确定是否需要进行条件运算。

Q1. Is IVT start address always set to 0x00000000?

仅适用于支持 BIOS 并使用 BIOS 启动的 80x86 系统。

Q2. Is IVT size always 1024 bytes? Q3. Is BDA start address always set to 0x00000400?

这些东西之间没有任何 "hard barrier"。 IVT 本身是 1 KiB,但是各种条目(尤其是接近尾声的条目)用于 BIOS 数据,所以它更像是 IVT 和 BDA 交织和重叠。

Q4. Is BDA size always 256 bytes?

为了与古老的 DOS 兼容,BDA "should" 在 0x00000500 之前结束。不能保证 BIOS 关心与古代 DOS 东西的兼容性。

一个更好的(更多 cautious/conservative)想法是忽略前 4 KiB RAM,直到操作系统的引导代码不再需要 BIOS,然后将其视为免费可用RAM(与 EBDA 不同,OS 没有理由将数据保存在 BDA 中)。

注意:即使引导代码仍然需要 BIOS,引导代码也没有理由读取 BDA 本身中的任何内容(它只需要避免破坏数据,这样 BIOS 可以阅读)。例如,不用查看 0x040E,您可以只使用 int 0x12(或 int 0x15, eax=0xE820)。我看到人们使用 BDA 的唯一其他事情是确定软盘驱动器类型和串口数量(这些来自 BIOS 设置的东西很可能被用户设置错误,因此不可靠和没用)。