2. ACPI表结构基础
ACPI(高级配置与电源接口)规范定义了一套分层的表结构,用于在操作系统和固件之间传递硬件配置、电源管理和性能调优信息。理解这些核心表的功能与层级关系,是进行ACPI启动项目开发和电源性能调优的基石。本章将深入剖析从根表(RSDP)到具体描述表(如DSDT、MADT)的完整链路。
2.1 ACPI表层级总览
ACPI表采用“根表指针 → 根表 → 多级描述表”的树状层级结构。操作系统启动时,首先通过UEFI或BIOS找到根系统描述指针(RSDP),然后依次解析RSDT/XSDT,最终定位到所有功能描述表。
2.2 根表:RSDP、RSDT与XSDT
2.2.1 RSDP(根系统描述指针)
RSDP是ACPI表的入口点,位于UEFI或BIOS的特定内存区域(通常在EBDA或系统ROM中)。操作系统引导时,通过搜索“RSD PTR ”签名来定位RSDP。
| 字段 | 偏移 | 大小 | 描述 |
|---|---|---|---|
| Signature | 0 | 8字节 | “RSD PTR ”(含空格) |
| Checksum | 8 | 1字节 | 整个RSDP的校验和 |
| OEMID | 9 | 6字节 | OEM厂商标识 |
| Revision | 15 | 1字节 | 0表示ACPI 1.0,2表示ACPI 3.0+ |
| RsdtAddress | 16 | 4字节 | RSDT的32位物理地址 |
| Length | 20 | 4字节 | RSDP表的总长度 |
| XsdtAddress | 24 | 8字节 | XSDT的64位物理地址(Revision≥2时有效) |
2.2.2 RSDT与XSDT
RSDT(根系统描述表)和XSDT(扩展系统描述表)是ACPI表层级中的第二层,它们包含指向其他ACPI描述表(如FADT、DSDT、MADT等)的指针数组。RSDT使用32位指针,XSDT使用64位指针,后者是ACPI 3.0引入的扩展版本。
2.3 核心功能描述表
2.3.1 FADT(固定ACPI描述表)
FADT是ACPI规范中最核心的表之一,它定义了硬件寄存器块(如PM1a、PM1b、GPE0等)的基地址,以及DSDT的地址。FADT还包含电源管理配置信息,如SMI命令端口、ACPI启用/禁用标志等。
- 硬件寄存器基址: PM1a_EVT_BLK、PM1b_EVT_BLK、GPE0_BLK、GPE1_BLK等。
- DSDT指针: X_DSDT(64位地址)或DSDT(32位地址)。
- 电源管理配置: SLP_TYPx、SMI_CMD、ACPI_ENABLE等。
- 重置寄存器: RESET_REG、RESET_VALUE。
2.3.2 DSDT(差异化系统描述表)
DSDT是ACPI表中最复杂的表,它包含用ACPI源语言(ASL)编写的AML字节码。DSDT定义了主板上的所有设备、它们的电源状态、热管理策略以及各种控制方法。操作系统通过ACPI驱动解析DSDT,构建设备树并执行电源管理操作。
// DSDT 头部示例(ASL源码)
DefinitionBlock ("DSDT.aml", "DSDT", 2, "OEMID", "OEMTABLEID", 0x00000001)
{
Scope (_SB)
{
Device (PCI0)
{
Name (_HID, EisaId ("PNP0A08")) // PCI Express 总线
Method (_OSC, 4, NotSerialized)
{
// 操作系统能力协商
}
}
}
}
2.3.3 SSDT(辅助系统描述表)
SSDT用于补充DSDT的定义,通常由OEM或操作系统动态加载。SSDT可以包含额外的设备定义、电源管理方法或性能调优策略。在电源性能调优中,SSDT常用于定义CPU的P-State(性能状态)和C-State(空闲状态)配置。
2.3.4 MADT(多APIC描述表)
MADT描述了系统中的中断控制器配置,包括本地APIC、I/O APIC、x2APIC等。操作系统使用MADT来初始化中断子系统,并将中断路由到正确的CPU核心。
| 条目类型 | 类型值 | 描述 |
|---|---|---|
| 本地APIC | 0 | 描述每个CPU核心的本地APIC ID |
| I/O APIC | 1 | 描述I/O APIC的基地址和全局中断基号 |
| 中断源覆盖 | 2 | 覆盖ISA中断的极性/触发模式 |
| 本地x2APIC | 9 | 扩展的本地APIC描述(用于大型系统) |
2.3.5 SRAT(系统资源关联表)
SRAT用于描述内存和CPU核心之间的亲和性关系,即哪些内存区域属于哪个NUMA节点。操作系统利用SRAT优化内存分配策略,减少跨节点访问延迟。
- 处理器亲和性: 将CPU核心映射到NUMA节点。
- 内存亲和性: 将物理内存范围映射到NUMA节点。
- SLIT补充: SRAT提供节点间的距离信息,SLIT提供更精确的延迟矩阵。
2.3.6 SLIT(系统局部性信息表)
SLIT定义了NUMA节点之间的相对距离(延迟)。操作系统使用SLIT进行智能调度和内存分配,以最小化跨节点访问开销。SLIT是一个二维矩阵,矩阵中的值表示节点间的相对距离。
// SLIT 矩阵示例(4个NUMA节点)
// 节点0到节点0的距离为10(本地访问)
// 节点0到节点1的距离为20(跨节点访问)
// 节点0到节点2的距离为30(远端访问)
// 节点0到节点3的距离为40(最远端访问)
[10, 20, 30, 40]
[20, 10, 40, 30]
[30, 40, 10, 20]
[40, 30, 20, 10]
2.4 表间依赖与解析顺序
操作系统在启动过程中,按照严格的顺序解析ACPI表:
- 定位RSDP: 在UEFI配置表或BIOS内存区域搜索“RSD PTR ”签名。
- 解析RSDT/XSDT: 读取RSDP中的RSDT/XSDT地址,获取所有功能描述表的指针列表。
- 加载FADT: 从RSDT/XSDT中找到FADT,获取DSDT地址和硬件寄存器基址。
- 加载DSDT/SSDT: 解析DSDT和所有SSDT,构建ACPI命名空间和设备树。
- 加载MADT: 初始化中断控制器和CPU拓扑。
- 加载SRAT/SLIT: 建立NUMA拓扑,优化内存和调度策略。
2.5 表结构在电源性能调优中的应用
在电源性能调优工程中,ACPI表提供了关键的配置接口:
- FADT: 修改PM1寄存器基址,调整睡眠状态(S1/S3/S4)的触发方式。
- DSDT/SSDT: 自定义CPU的P-State表(_PSS)、C-State参数(_CST)和热管理阈值(_TMP)。
- MADT: 确认CPU拓扑和中断分配,优化中断亲和性。
- SRAT/SLIT: 优化内存分配策略,减少跨NUMA节点访问的功耗和延迟。