2. ACPI核心表结构:RSDP、RSDT/XSDT、FADT、DSDT、SSDT、MADT、SBST表的定义与作用

ACPI(高级配置与电源接口)规范的核心是一套层次化的表结构,这些表在系统启动初期由固件(UEFI/BIOS)构建并放置在内存中,供操作系统内核解析。理解这些表的定义、层级关系以及各自的作用,是进行嵌入式设备电源集成与调试的基础。本章将逐一剖析ACPI启动过程中最关键的几张表。

核心概念: ACPI表结构采用“根指针 → 根表 → 定义块/数据表”的三级架构。操作系统通过定位根系统描述指针(RSDP),进而找到根系统描述表(RSDT/XSDT),最终遍历所有功能表(FADT、DSDT、SSDT等)。

2.1 ACPI表层级总览

下图展示了ACPI核心表之间的依赖与引用关系。RSDP是入口点,RSDT/XSDT是索引目录,其余表则承载具体的硬件接口、电源管理方法和设备定义。

ACPI核心表层级关系图 RSDP RSDT / XSDT(根系统描述表) FADT MADT DSDT SSDT SBST 说明: • RSDP 是入口,RSDT/XSDT 是索引表,指向其他所有表。 • FADT 包含硬件寄存器地址,DSDT/SSDT 包含 AML 方法代码。 • MADT 描述中断控制器拓扑,SBST 定义电池充电阈值。

2.2 RSDP(根系统描述指针)

RSDP(Root System Description Pointer) 是ACPI表的唯一入口点。操作系统在启动时,通过搜索特定的内存区域(传统BIOS的EBDA或UEFI的配置表)来定位RSDP。

  • 签名: 固定为 "RSD PTR "(注意末尾有空格)。
  • 校验和: 包含一个字节的校验和,用于验证RSDP结构的完整性。
  • OEMID: 标识提供该表的原始设备制造商。
  • RSDT地址: 指向根系统描述表(RSDT)的物理地址。
  • XSDT地址(ACPI 2.0+): 指向扩展系统描述表(XSDT)的64位物理地址。
调试要点: 在嵌入式系统启动阶段,如果操作系统无法找到有效的RSDP(校验和失败或签名错误),ACPI子系统将完全无法初始化。此时应检查固件配置是否正确,以及RSDP是否被放置在操作系统约定的搜索范围内。

2.3 RSDT / XSDT(根系统描述表 / 扩展系统描述表)

RSDT(Root System Description Table) 和 XSDT(Extended System Description Table) 本质上是ACPI表的“目录”。它们包含一个指针数组,每个指针指向一个独立的ACPI表(如FADT、DSDT、MADT等)。

特性 RSDT XSDT
引入版本 ACPI 1.0 ACPI 2.0
指针宽度 32位 64位
适用架构 32位系统 64位系统(兼容32位)
表头结构 标准ACPI表头 + 32位地址数组 标准ACPI表头 + 64位地址数组
操作系统选择 优先使用XSDT,若不存在则回退到RSDT 首选

操作系统通过解析RSDT/XSDT中的地址列表,逐一验证每个子表的签名和校验和,从而加载所有必要的ACPI表。

2.4 FADT(固定ACPI描述表)

FADT(Fixed ACPI Description Table) 是ACPI硬件接口的核心。它包含了与电源管理相关的固定硬件寄存器的地址和配置信息。

  • SCI中断号: 系统控制中断(System Control Interrupt)的向量号。
  • PM1a/PM1b事件寄存器块地址: 用于处理电源管理事件(如电源按钮、睡眠按钮)。
  • PM控制寄存器块地址: 用于控制系统状态转换(如进入S1睡眠状态)。
  • PM定时器寄存器块地址: 提供ACPI定时器。
  • DSDT地址: 指向差异化系统描述表(DSDT)的指针。
  • 重置寄存器地址: 用于系统重置的寄存器。
常见问题: 在嵌入式平台中,FADT中定义的硬件寄存器地址必须与SoC的数据手册严格一致。地址错误会导致操作系统无法正确进入或退出睡眠状态,甚至引发系统挂起。调试时,建议通过ACPI工具(如acpidump)比对FADT中的地址与硬件寄存器映射。

2.5 DSDT(差异化系统描述表)

DSDT(Differentiated System Description Table) 是ACPI定义块的主体,它包含用ACPI源语言(ASL)编写的设备定义和电源管理方法。DSDT是平台相关的,描述了主板上的所有ACPI兼容设备及其电源管理能力。

  • 定义块: 包含设备对象(Device)、控制方法(Method)、通知(Notify)等。
  • AML字节码: DSDT中的ASL代码被编译为ACPI机器语言(AML),由操作系统中的AML解释器执行。
  • 作用域: 覆盖整个平台,通常包含CPU、内存控制器、PCI总线、嵌入式控制器等核心设备。
// DSDT 片段示例:定义一个简单的电源按钮设备
DefinitionBlock ("DSDT.aml", "DSDT", 2, "OEMID", "TABLEID", 0x00000001)
{
    Scope (_SB)
    {
        Device (PWRB)
        {
            Name (_HID, EisaId ("PNP0C0C"))  // 电源按钮硬件ID
            Name (_UID, 0x00)
            Method (_STA, 0, NotSerialized)
            {
                Return (0x0F)  // 设备存在且启用
            }
        }
    }
}

2.6 SSDT(辅助系统描述表)

SSDT(Secondary System Description Table) 是DSDT的补充。它允许OEM或BIOS供应商在不修改DSDT的情况下,动态添加或覆盖设备定义和方法。SSDT常用于以下场景:

  • CPU性能状态(P-State)定义: 为不同型号的CPU提供特定的频率和电压表。
  • 热区(Thermal Zone)定义: 定义温度传感器和风扇控制策略。
  • 嵌入式控制器(EC)固件更新: 通过SSDT提供新的EC方法。
  • 设备覆盖: 修复DSDT中的错误或添加新设备支持。
调试技巧: 在Linux系统中,可以通过加载自定义SSDT来覆盖有问题的DSDT定义,而无需刷新整个BIOS。这对于嵌入式设备的快速原型验证非常有用。

2.7 MADT(多APIC描述表)

MADT(Multiple APIC Description Table) 描述了系统中的中断控制器拓扑结构。对于多核ARM或x86嵌入式系统,MADT是操作系统初始化中断子系统的关键。

条目类型 描述 典型用途
本地APIC 每个CPU核心的本地中断控制器 处理核间中断(IPI)和本地定时器中断
I/O APIC 系统I/O中断控制器 将外设中断路由到指定的CPU核心
中断源覆盖 覆盖ISA中断的默认路由 解决传统设备的中断冲突
NMI源 非屏蔽中断源定义 硬件看门狗或紧急事件处理
GIC(ARM) 通用中断控制器(ARM架构) ARM GICv2/v3/v4的分布器和重分发器基地址

MADT中的每个条目都包含一个类型字段和长度字段,操作系统通过遍历这些条目来构建中断路由表。

2.8 SBST(智能电池系统表)

SBST(Smart Battery System Table) 是一个相对较小的表,用于定义智能电池子系统的充电和警告阈值。它通常出现在支持智能电池(Smart Battery)的嵌入式设备中。

  • 充电阈值: 定义电池从低电量状态开始充电的百分比。
  • 警告阈值: 定义触发系统低电量警告的电池容量百分比。
  • 设计容量: 电池的设计容量(mAh或mWh)。
实际案例: 在一款工业手持终端中,SBST表配置了充电阈值为15%,警告阈值为10%。当电池电量降至10%时,操作系统通过ACPI事件触发用户警告,并在电量降至5%时强制系统进入休眠状态,以保护数据不丢失。

2.9 表结构对比总结

下表汇总了本章介绍的7个核心ACPI表的关键属性,便于在实际调试中快速查阅。

表名 签名 主要作用 是否必须 调试关注点
RSDP "RSD PTR " ACPI入口指针 是 校验和、地址对齐
RSDT/XSDT "RSDT"/"XSDT" 表索引目录 是 指针列表完整性
FADT "FACP" 固定硬件寄存器地址 是 寄存器地址与SoC一致性
DSDT "DSDT" 设备定义与AML方法 是 ASL语法、AML字节码
SSDT "SSDT" 辅助定义与覆盖 否 动态加载顺序
MADT "APIC" 中断控制器拓扑 是 GIC/APIC基地址、条目类型
SBST "SBST" 智能电池阈值 否 充电/警告百分比