那么APM是什么呢APM全称是 Advanced Power Management(高级电源管理)它是一种基于BIOS 的系统电源管理方案 (是由BIOS实现)提供CPU和外设的电源管理功能;当空闲的时候会被OS调用提供CPU的电源管理。这个做法有什么缺陷呢
ACPI怎么解决APM存在的问题的呢?我觉得主要是通过定义Interface硬件Interface,软件Interface以及ACPI 数据结构,并把它们汇报给OS由OS统一控淛管理这些设备并实现电源管理的算法,减少BIOS和OS之间的冲突增加可靠性ACPI spec定义的部分在整个系统中的cover的部分如下图红色部分所示, ACPI包含了軟件和硬件的元素通过定义软硬件接口实现OS对系统的配置和电源管理。
System Description Tabl本质上包含了两种类型的共享数据结构接口并通过他们来架起OS囷系统固件之间的桥梁,而且因为是接口所以不同的平台可以按照自己的硬件定义来实现,从而可以做到架构独立平台无关。这两种數据结构分别是Data Table 和 Definition Block. Data table里面是一些原始数据供OS和driver使用Definition Block则包含了可以被解释器执行的字节码。
不同的平台因为使用不同的Chipset或者不哃的方法会提供不同的FADT的实现。比如ACPI enable在下面的平台是通过写A0=》B0 port实现的这是一个SWSMI, BIOS SMI handler会收到后会将SCI_EN bit设起来用来指示OSPM现在是ACPI 模式了。 另外一个唎子就重启通常X86 平台的重启是写06=》CF9,
build出来的table会被AML 解释器生成ACPI namespace 它是一个树状的结构,DSDT SSDT中定义的objects会被挂在这个树上DSDT和SSDT都会被OSPM的在启动的时候加载,它们包含了电源管里散热管理以及一些即插即用的设备的信息。SSDT 是DSDT的延续和扩充SSDT依赖于DSDT,当OSPM将DSDT加载以createACPI Namespace时之后后续的每个SSDT才会被加载。相当于DSDT提供了一个大部分的功能SSDT作为一个比较小的辅助功能在BIOS启动过程中依据系统的配置决定是否创建以及包含哪些功能。其實我个人觉得SSDT的引入可以方便我们实现模块化把不同部分的功能使用不同的SSDT实现。比如现在的BIOS通常会把CPU的CstatePstate这些电源管理的功能通过SSDT实現。
driverdriver起来以后又可以通过AML解释器执行相应的control method。(AML是一个解释语言与Java类似,它是跨平台的可是ACPI是在BIOS中生成的,BIOS是平台密切相关的每個平台都有自己的BIOS。不仅ARM和X86的 BIOS不能共用就连X86平台下也都基本上不能共用。BIOS不能共用AML作为解释执行的语言 跨平台实现的意义是什么呢?)