系统BIOS
会检查平台的remapping
硬件功能,并且会在主机的系统地址空间内定位memory-mapped remapping
硬件寄存器。BIOS
通过DMA Remapping Reporting (DMAR) ACPI table
向系统软件报告remapping
硬件单元信息。
除了RSDP
和FACS
,所有的ACPI table
定义都包含一个共同的header
定义:
struct acpi_table_header {
char signature[ACPI_NAME_SIZE]; /* ASCII table signature */
u32 length; /* Length of table in bytes, including this header */
u8 revision; /* ACPI Specification minor version number */
u8 checksum; /* To make sum of entire table == 0 */
char oem_id[ACPI_OEM_ID_SIZE]; /* ASCII OEM identification */
char oem_table_id[ACPI_OEM_TABLE_ID_SIZE]; /* ASCII OEM table identification */
u32 oem_revision; /* OEM revision number */
char asl_compiler_id[ACPI_NAME_SIZE]; /* ASCII ASL compiler vendor ID */
u32 asl_compiler_revision; /* ASL compiler version */
};
而DMA Remapping table
定义如下(可以看到包含有acpi_table_header
):
struct acpi_table_dmar {
struct acpi_table_header header; /* Common ACPI table header */
u8 width; /* Host Address Width */
u8 flags;
u8 reserved[10];
};
对所有的DMA Remapping
结构体,都会包含一个type
和一个length
:
/* DMAR subtable header */
struct acpi_dmar_header {
u16 type;
u16 length;
};
以DMA Remapping Hardware
单元(类型为0
)为例:
/* 0: Hardware Unit Definition */
struct acpi_dmar_hardware_unit {
struct acpi_dmar_header header;
u8 flags;
u8 reserved;
u16 segment;
u64 address; /* Register Base Address */
};
其它的还有acpi_dmar_reserved_memory
,acpi_dmar_atsr
等等定义。