UEFI 笔记 001 — 什么是 ACPI method
声明:个人笔记,概不负责
一句话
所谓 ACPI method 本质上就是 Callback 函数。是在 OS 主导下,OS 发起的,对 System Firmware 的调用。
类似在 Windows 上用 C 编写 Win32 应用,需要实现一堆 OS 要求的 Callback 函数。
ACPI method 的提供者 System Firmware ,事实上在 实现 OS 要求的 Callback 函数。
所不同的是,OS 调用 C 应用的是 native code ,而调用 System Firmware 的是 AML code.
System Firmware 本身是 native code ,为满足 OS 的目的,不得不提供 AML code
System Firmware 本身并不执行这些 AML 代码,只是在交割管理权给 OS 时,以“一片内存”的形式传递准备好的 AML code
OS 解释执行 AML 代码,由于 OS 理解 AML 所需资源,所以 OS 能把 AML code 中 对 hardware 的 调用,转成 native 调用。
OS 之所以理解 AML 所需资源,是因为 System Firmware 用 AML 格式描述了 所需资源。
啰嗦的话
可以想象最糟糕的情况是,对某个 device ,在 System Firmware 用 native code 实现一段逻辑,又在 AML code 中写了一份类似的逻辑,而在 OS 中的 driver 又又又用 native code 实现了一次。
在 OS 接管后,System Firmware 失去 “用 native code 控制” 的权力,它的残影只在它提供的 AML code 中存在。OS 以某种方式 平衡 ACPI Device AML code 与 OS Device Driver native code 互动。
有些系统 System Firmware 执念 native code 的权力,交接给 OS 后还不想放弃,所以系统变得复杂。有些系统 System Firmware 并不在乎,交割管理权给 OS 后,自己的 native code 权力随之放弃。
(2025-06-27 注:此处用词颇为不严谨; 2025-06-27 晚:经挑战大佬后被灭,确定上述 native code 描述 的确是垃圾)
(UEFI native code 可以交给 OS native code 管理,史称 UEFI Runtime —— 它其实也是一片内存,内存里是 C native code)
(它可以裸奔 —— 没有特殊要求;这非常可怕,所以种种手段附加上来 —— 弄它! 这个话题,得另辟文章才能讲清概要)
在读了 ACPI 5.0(2011年)加入的 Hardware-Reduced ACPI 叙述之后,颇能体会 ACPI method 的本质。
ACPI spec 的演化,是 写 spec 的人解决问题时 觉得对 spec 不爽,自己把 spec 改造成需要的样子。
—— 2012 年,Windows 8 发布,基于 SoC 运行的 Windows 8 需要 ACPI 5.0
—— 2011 年,ACPI 5.0 发布,里面有一大堆 微软递交的更改。
Hardware-Reduced ACPI 可译作 —— 精简硬件 ACPI(借鉴 RISC 的翻译)
Windows 8 第一次开始支持 手机、平板系统,第一次开始支持 ARM 处理器。
[ACPI-old] https://uefi.org/acpi/specs
[Win-ACPI] https://learn.microsoft.com/en-us/windows-hardware/drivers/kernel/acpi-driver
[Win8-SOC] https://learn.microsoft.com/en-us/windows-hardware/drivers/bringup/windows-acpi-design-guide-for-soc-platforms
[Window8] https://en.wikipedia.org/wiki/Windows_8