15.1. INT 15H, E820H - 查询系统地址映射
该接口仅在基于 IA-PC 的系统的实模式下使用,并提供所有已安装 RAM 以及 BIOS 保留的物理内存范围的内存映射。地址映射通过连续调用此接口返回;每次调用返回一个物理地址范围的信息。每个范围都包含一个类型,指示 OSPM 应如何处理该物理地址范围。
如果从 E820 返回的信息在某种程度上与 INT-15 88 或 INT-15 E801 不同,则以 E820 返回的信息为准,覆盖 INT-15 88 或 INT-15 E801 返回的信息。此替换允许 BIOS 出于兼容性原因返回来自 INT-15 88 或 INT-15 E801 的任何所需信息。出于兼容性原因,如果 E820 在 16 MiB 以下返回任何 AddressRangeACPI 或 AddressRangeNVS 内存范围,则 INT-15 88 和 INT-15 E801 函数必须返回位于 AddressRangeACPI 和 AddressRangeNVS 内存范围下方的内存顶部地址。
此接口传达的内存映射不要求反映 BIOS 最初将控制权交给操作系统之后可用物理内存所发生的任何变化。例如,如果动态添加了内存,则此接口不要求反映新的系统内存配置。
表 15.2 INT 15h E820h 调用的输入
| 寄存器 | 内容 | 描述 |
|---|---|---|
| EAX | 功能代码 | E820h |
| EBX | 续接值 | 包含用于获取下一物理内存范围的续接值。该值是此前对此例程调用返回的值。如果这是第一次调用,EBX 必须包含零。 |
| ES:DI | 缓冲区指针 | 指向 BIOS 填充的地址范围描述符结构的指针。 |
| ECX | 缓冲区大小 | 传递给 BIOS 的结构长度(字节)。BIOS 填充 ECX 寄存器中所指示数量的字节,最多不超过其实现的结构长度。BIOS 和调用方都必须支持的最小大小为 20 字节。未来的实现可能会扩展此结构。 |
| EDX | 签名 | ‘SMAP’ BIOS 用于验证调用方是否请求在 ES:DI 中返回系统映射信息。 |
表 15.3 INT 15h E820h 调用的输出
| 寄存器 | 内容 | 描述 |
|---|---|---|
| CF | 进位标志 | 无进位 - 表示无错误 |
| EAX | 签名 | ‘SMAP.’ 用于验证 BIOS 修订版正确性的签名。 |
| ES:DI | 缓冲区指针 | 返回的地址范围描述符指针。与输入时的值相同。 |
| ECX | 缓冲区大小 | BIOS 在地址范围描述符中返回的字节数。BIOS 返回的最小大小结构为 20 字节。 |
| EBX | 续接值 | 包含用于获取下一地址范围描述符的续接值。续接值的实际意义由 BIOS 自行决定。调用方必须将续接值作为下一次 E820 调用的输入原样传递,以获取下一个地址范围描述符。返回值为零表示这是最后一个描述符。注意:BIOS 也可以通过将进位标志置位返回,指示最后一个描述符已在之前的迭代中返回。进位标志置位时,调用方将忽略 BIOS 返回的任何其他信息。 |
表 15.4 地址范围描述符结构
| 字节偏移 | 名称 | 描述 |
|---|---|---|
| 0 | BaseAddrLow | 基地址的低 32 位 |
| 4 | BaseAddrHigh | 基地址的高 32 位 |
| 8 | LengthLow | 长度的低 32 位(字节) |
| 12 | LengthHigh | 长度的高 32 位(字节) |
| 16 | Type | 该范围的地址类型 |
| 20 | Extended Attributes | 见 地址范围描述符结构的扩展属性 |
BaseAddrLow 和 BaseAddrHigh 一起构成该范围的 64 位基地址。基地址是所指定范围起始处的物理地址。
LengthLow 和 LengthHigh 一起构成该范围的 64 位长度。长度是所指定范围在物理上连续的字节长度。
Type 字段描述了 地址范围类型 中定义的该地址范围的用途。
表 15.5 地址范围描述符结构的扩展属性
| 位 | 助记符 | 描述 |
|---|---|---|
| 0 | Reserved | 保留,必须设置为 1。 |
| 2:1 | Reserved | 保留,必须设置为 0。 |
| 3 | AddressRangeErrorLog | 如果置位,则该地址范围描述符表示用于记录硬件错误的内存。 |
| 31:4 | Reserved | 保留供将来使用。 |
注意
上面的位 [1] 和 [2] 自 ACPI 6.1 起已弃用。位 [3] 仅在 PC-AT BIOS 系统上用于在内存中定位错误日志。在基于 UEFI 的系统上,必须实现 UEFI 硬件错误记录 HwErrRec#### 运行时 UEFI 变量接口,或为 APEI ERST 接口实现错误记录序列化操作 0xD、0xE 和 0xF,以用于错误日志。