2. ACPI核心表结构:RSDP、RSDT/XSDT、FADT、DSDT、SSDT、MADT、SBST表的定义与作用
ACPI(高级配置与电源接口)规范的核心是一套层次化的表结构,这些表在系统启动初期由固件(UEFI/BIOS)构建并放置在内存中,供操作系统内核解析。理解这些表的定义、层级关系以及各自的作用,是进行嵌入式设备电源集成与调试的基础。本章将逐一剖析ACPI启动过程中最关键的几张表。
2.1 ACPI表层级总览
下图展示了ACPI核心表之间的依赖与引用关系。RSDP是入口点,RSDT/XSDT是索引目录,其余表则承载具体的硬件接口、电源管理方法和设备定义。
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位物理地址。
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)的指针。
- 重置寄存器地址: 用于系统重置的寄存器。
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中的错误或添加新设备支持。
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)。
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" | 智能电池阈值 | 否 | 充电/警告百分比 |