[ACPI高级配置与电源接口] -ACPI基础
什么是ACPI
Advanced Configuration and Power Interface
由1997年,英特尔、微软、东芝公司共同提出、制定操作系统应用程序管理电源管理接口,是一种工业标准,包括了软件和硬件方面的规范。ACPI规范是为了建立工业通用接口,以支持面向操作系统的主板设备配置和电源管理。ACPI是面向操作系统的配置和电源管理(OSPM)中的关键元素。
ACPI的功能
系统电源管理 ACPI定义了控制计算机出入全局状态(G-state)/睡眠状态(S-state)等的机器。
设备电源管理 定义主板设备的电源状态(D-state)
处理器电源管理 OS在空闲状态时,OSPM通过ACPI使CPU进入不同的电源状态(C-state)
设备和处理器性能管理 当系统处于活动状态时,OSPM通过ACPI可以将设备和CPU设置成不同的性能状态,以达到性能和功耗的平衡(P-sate)。
配置/即插即用 定义了一系列的设备信息,它们按照层级结构组织,通过这些信息OS可以知道设备的状态以及插拔情况。
系统事件 提供的一种事件机制用于处理温度变化,电源管理和设备插拔等事件。
电池管理 对OS管理电池提供支持。
温度管理 为OS提供控制系统降温策略的控制接口。
嵌入式控制管理 定义了一套软硬件接口,可以使OS可以和计算机上其他嵌入式控制器交流。
SMBus控制管理 定义了一套软硬件接口,可以使OS可以和计算机上的SMBus控制器及其连接的设备交流。
ACPI框架
下图给出了OSPM/ACPI相关的硬件与软件组件及它们之间的联系。
ACPI有三个运行时组件:
ACPI 寄存器(ACPI Registers) 由ACPI Tables描述的硬件接口
ACPI 固件(ACPI BIOS) 与ACPI规范兼容的系统固件,ACPI Tables由其提供。
ACPI 表(ACPI Tables) 定义了系统的硬件接口。ACPI表包含定义块(Definition Blocks),这些定义块使用伪代码类型的语言-AML(ACPI Machine Language),OSPM包含解释器对这部分代码进行解释并保存在操作系统的ACPI表中。
如何找到ACPI表?
ACPI表是在系统启动阶段由BIOS/UEFI收集系统各方面信息并创建的,它大致以树形的组织形式(如下图所示)存在系统物理内存中。
整个ACPI表以RSDP(Root System Descriptor Pointer Table)为入口点,每个非叶子节点都会包含指向其他子表的指针,各个表都会有一个表头,在该表头中包含了相应的Signature,用于标识该表,查找ACPI表的关键就是在内存中定位到RSDP表。
对于UEFI系统:RSDP的位置信息存在于UEFI System Table中,UEFI Spec中给ACPI1.0与2.0及之后的规范规定了两个GUID;Bootloader需要从UEFI System Table中提取RSDP位置信息并提供给OSPM
对于Legacy系统:OSPM通过扫描内存寻找RSDP的Signature来找到RSDP,可能存在于如下位置:
位于EDBA(Extended BIOS Data Area)的前1kb范围内
0E0000h到0FFFFFh的BIOS只读内存地址范围内
ACPI表的结构
RSDP表结构如下表
当OSPM找到RSDP,下一步OSPM需定位RSDT或XSDT表来获取其他ACPI Tables的物理地址信息。如上图,RSDP中包含RsdtAddress/XsdtAddress,即RSDT(Root System Description Table)/XSDT( Extended System Description Table)的地址。它们包含指向其他Tables的物理地址信息。OSPM通过找到这些Table来获取系统的基本信息。
如下图所示,通常XSDT包含的第一个Entry保存着FADT表(Fixed ACPI Description Table)的物理地址,FADT表的Signature为FACP。
FADP表中包含如下内容:
DSDT - Differentiated System Description Table 包含定义块(Definition Blocks)。定义块中包含着硬件平台的配置和实现信息,这些信息存储在以分层树状结构保存的数据对象(Data Object)中,形成ACPI命名空间(ACPI namespace)。 DSDT中的定义块主要包含OPSM用于电源管理、温度管理、热插拔功能的配置和实现信息。
ACPI Hardware Register Block
OS需要用这些配置信息来直接管理ACPI硬件寄存器块.
FACS - Firmware ACPI Control Structure
包含上次启动的hardware signature, waking vector与Global Lock。
其他ACPI表的地址也保存在XSDT表格中的Entry中。
相关Spec: https://www.acpica.org/documentation https://uefi.org/acpi