各位小伙伴,我也是刚刚尝试ACPI研读的小白,有很多问题也不太清除,如有错误请多多指出。
CSDN上关于ACPI知识点实在是太少,ACPI specification也臭长。耐不住性子去看完。今天跟着磊哥从了解ACPI开始,带大家一起进入ACPI知识遨游。
History of ACPI
在ACPI出现之前,最开始是BIOS 为OS提供电源管理设备识别和配置,但是毛病也是很多。主要包含三个方面,一.操作系统应用程序调用BIOS程序影响电源管理。二.系统兼容性,每个系统都要重新开发,还要单独去学习电源控制知识。三.不同设备的有可能产生相互冲突甚至宕机及其它不可预测问题。为解决上述问题,上世纪90年代中期(我还没有出生),由Intel, Microsoft*, Toshiba*, HP*, and Phoenix*这几个家伙组建联盟,设计ACPI标准。
What is ACPI?
ACPI是独立的电源管理框架内嵌于操作系统。ACPI框架定义一系列硬件接口寄存器用于定义电源状态,这些寄存器可以适配特定和通用的硬件。
ACPI最主要的目的是就是这些电源管理寄存器,OS不同直接调用固件去配置系统。反而ACPI作为OS和固件之间的桥梁。
如下图
ACPI定义两种不同的数据结构,通过ACPI 子系统将BIOS和OS关联。data tables and definition blocks 。Data tables用于设备驱动。Definition blocks包含许多字节码,可以被翻译器执行。
谈到初始化,AML翻译器从definition block提取字节码作为enumerable objects。这些enumerable objects构成OS所谓的ACPI namespace。如下图。有点难度
The definition block 字节码由ACPI Source Language (ASL) code编译来。ASL定义了ACPI objects和control methods。An ASL 编译器将ASL code转换为ACPI Machine Language (AML) 字节码。
ACPI Source Language (ASL) 码定义objects and control methods.这些编译成Machine Language (AML) 字节码包含在ACPI definition block。Definition blocks由一个标识的头部和字节码由 AML interpreter码翻译执行。
收集枚举对象被称为ACPI namespace 由操作系统构建。namespace 是层级化。系统总线属于枚举化ACPI设备的根。有些枚举的设备属于其它总线,例如PCI,USB等通常不会在namespace中枚举。这些设备有他们自己总线进行枚举并加载它们驱动。为了能在ACPI中找到设备,所有枚举总线都有编码技术允许ACPI编码设备地址。
通常拥有_HID object设备都是可枚举并可以别ACPI加载,拥有_ADR object设备通常不被ACPI枚举,也没有能被ACPI加载的驱动。_ADR设备可以在不涉及ACPI执行功能。但是在设备驱动不能执行,或者驱动需要和固件通信,ACPI将判断object执行功能。
列如,PCI不支持本地热插拔。PCI可以使用ACPI评估objects,定义方法使得ACPI填充必要功能在PCI上实现热插拔。
另一方面,ACPI属于runtime model,可以处理ACPI中断事件。ACPI也继续评估特定对象处理这些事件。
ACPI 初始化流程
按时间轴理解ACPI工作流程最好方式。用户启动系统,系统固件完成其设置初始化,及自检。
固件使用ACPI初始化过程中信息更新ACPI table 作为不同平台配置和电源接口数据。在将控制器交给bootstrap loader之前,extended root system description table (XSDT)