2. ACPI表结构基础:核心表的功能与层级关系

ACPI(高级配置与电源接口)规范定义了一套分层的表结构,用于在操作系统和固件之间传递硬件配置、电源管理和性能调优信息。理解这些核心表的功能与层级关系,是进行ACPI启动项目开发和电源性能调优的基石。本章将深入剖析从根表(RSDP)到具体描述表(如DSDT、MADT)的完整链路。

2.1 ACPI表层级总览

ACPI表采用“根表指针 → 根表 → 多级描述表”的树状层级结构。操作系统启动时,首先通过UEFI或BIOS找到根系统描述指针(RSDP),然后依次解析RSDT/XSDT,最终定位到所有功能描述表。

核心层级关系: RSDP(根指针)→ RSDT/XSDT(根表)→ FADT、DSDT、SSDT、MADT、SRAT、SLIT等(功能描述表)。
ACPI表层级架构图 ACPI表层级架构图 RSDP 根系统描述指针 RSDT 根系统描述表 (32位) XSDT 扩展系统描述表 (64位) FADT 固定ACPI描述表 DSDT 差异化描述表 SSDT 辅助描述表 MADT 多APIC描述表 SRAT 系统资源关联表 SLIT 系统局部性信息表 说明 操作系统通过RSDP找到RSDT/XSDT,再通过RSDT/XSDT中的表指针找到所有功能描述表。 DSDT和SSDT包含AML字节码,用于定义设备对象和电源管理方法。

2.2 根表:RSDP、RSDT与XSDT

2.2.1 RSDP(根系统描述指针)

RSDP是ACPI表的入口点,位于UEFI或BIOS的特定内存区域(通常在EBDA或系统ROM中)。操作系统引导时,通过搜索“RSD PTR ”签名来定位RSDP。

字段偏移大小描述
Signature08字节“RSD PTR ”(含空格)
Checksum81字节整个RSDP的校验和
OEMID96字节OEM厂商标识
Revision151字节0表示ACPI 1.0,2表示ACPI 3.0+
RsdtAddress164字节RSDT的32位物理地址
Length204字节RSDP表的总长度
XsdtAddress248字节XSDT的64位物理地址(Revision≥2时有效)

2.2.2 RSDT与XSDT

RSDT(根系统描述表)和XSDT(扩展系统描述表)是ACPI表层级中的第二层,它们包含指向其他ACPI描述表(如FADT、DSDT、MADT等)的指针数组。RSDT使用32位指针,XSDT使用64位指针,后者是ACPI 3.0引入的扩展版本。

兼容性提示: 在64位系统上,操作系统应优先使用XSDT。如果XSDT不可用,则回退到RSDT。XSDT的签名是“XSDT”,RSDT的签名是“RSDT”。

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(空闲状态)配置。

实战要点: 在Linux中,可以通过加载自定义SSDT来覆盖DSDT中的默认电源管理行为,实现CPU频率和电压的精细调优。

2.3.4 MADT(多APIC描述表)

MADT描述了系统中的中断控制器配置,包括本地APIC、I/O APIC、x2APIC等。操作系统使用MADT来初始化中断子系统,并将中断路由到正确的CPU核心。

条目类型类型值描述
本地APIC0描述每个CPU核心的本地APIC ID
I/O APIC1描述I/O APIC的基地址和全局中断基号
中断源覆盖2覆盖ISA中断的极性/触发模式
本地x2APIC9扩展的本地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表:

  1. 定位RSDP: 在UEFI配置表或BIOS内存区域搜索“RSD PTR ”签名。
  2. 解析RSDT/XSDT: 读取RSDP中的RSDT/XSDT地址,获取所有功能描述表的指针列表。
  3. 加载FADT: 从RSDT/XSDT中找到FADT,获取DSDT地址和硬件寄存器基址。
  4. 加载DSDT/SSDT: 解析DSDT和所有SSDT,构建ACPI命名空间和设备树。
  5. 加载MADT: 初始化中断控制器和CPU拓扑。
  6. 加载SRAT/SLIT: 建立NUMA拓扑,优化内存和调度策略。
ACPI表解析流程图 ACPI表解析流程图 1. 定位RSDP 2. 解析RSDT/XSDT 3. 加载FADT 4. 加载DSDT/SSDT 5. 加载MADT/SRAT/SLIT 解析顺序严格依赖:必须先有FADT才能找到DSDT,必须先有MADT才能初始化中断。

2.5 表结构在电源性能调优中的应用

在电源性能调优工程中,ACPI表提供了关键的配置接口:

  • FADT: 修改PM1寄存器基址,调整睡眠状态(S1/S3/S4)的触发方式。
  • DSDT/SSDT: 自定义CPU的P-State表(_PSS)、C-State参数(_CST)和热管理阈值(_TMP)。
  • MADT: 确认CPU拓扑和中断分配,优化中断亲和性。
  • SRAT/SLIT: 优化内存分配策略,减少跨NUMA节点访问的功耗和延迟。
注意事项: 修改ACPI表(尤其是DSDT)需要谨慎。错误的修改可能导致系统无法启动或硬件损坏。建议在开发环境中使用自定义SSDT进行覆盖测试,避免直接修改固件中的DSDT。

2.6 本章小结