1. ACPI系统描述表概述
ACPI(Advanced Configuration and Power Interface)作为现代计算机系统中电源管理和硬件配置的核心规范,其系统描述表(System Description Tables)承载着关键硬件信息。在众多描述表中,MADT(Multiple APIC Description Table)因其与中断处理架构的深度绑定而显得尤为重要。
我在x86平台开发过程中发现,理解MADT结构对处理多核调度、中断分配等问题至关重要。这张表不仅记录了APIC(Advanced Programmable Interrupt Controller)的拓扑结构,还定义了全局系统中断(Global System Interrupts, GSI)的映射关系,是操作系统实现高效中断管理的基础。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. MADT表结构深度解析
2.1 表头标准结构
所有ACPI表都以统一头部开始:
c复制struct acpi_table_header {
char signature[4]; // "APIC"标识MADT
uint32_t length;
uint8_t revision;
uint8_t checksum;
char oem_id[6];
char oem_table_id[8];
uint32_t oem_revision;
char asl_compiler_id[4];
uint32_t asl_compiler_revision;
};
实际开发中需注意:校验和字段要求表中所有字节相加的低8位必须为0,这个细节在手动修改表内容时容易被忽略。
2.2 关键数据字段
头部之后紧跟两个核心字段:
- Local APIC Address (32-bit):记录本地APIC的MMIO基地址
- Flags (32-bit):bit 0表示是否支持PC-AT兼容双8259A PIC
在调试某款国产SoC时,我曾遇到Flags位解析错误导致系统无法识别传统PIC的问题。这提醒我们即使是看似简单的标志位也需要严格验证。
2.3 可变长度条目区
MADT最核心的部分是由多个变长条目组成的数组,每个条
