在UEFI阶段处理ACPI表的主要流程

Armin
2026-03-27 / 0 评论 / 1 阅读 / 正在检测是否收录...

一、 ACPI 表的加载与更新流程

整个过程可以概括为:静态读取 -> 动态修补 -> 正式交付。

1.静态读取
AcpiPlatformDxe 驱动启动时,它通过 ReadSection 函数从固件卷(FV)中读取预编译好的 AML 二进制数据(即 iasl 编译 asl 后的产物)。此时的表是 asl 源码的复制。

3.动态修补
AcpiPlatformDxe 驱动的 UpdateAcpiTable 函数中主要对Dsdt、Madt、Ssdt三个表进行了更新。其中对Dsdt的更新采用异步更新的方法,驱动调用了 EfiCreateProtocolNotifyEvent,它并不立即改表,而是等待 gPhytiumAllDriversConnectedProtocolGuid 信号。
当所有驱动加载完毕,回调函数 UpdateAcpiRamAfterPciEnum 被触发。它通过以下方式获取硬件的真实状态:

  • 调用 GetVariable:从bios设置中获取配置
  • 调用 GetParameterInfo:从 Flash 的 Parameter 区块读取当前单板的专属配置(例如:这块板子是用 EC 还是 SE 管理电源)。
    最终使用 AmlFindNodeAmlDetachNodeAmlNameOpUpdateInteger,查找acpi表的相关节点,进行删除、更新操作。

3.校验与交付
修补完成后,重新计算 Checksum(校验和),最后通过 InstallAcpiTable 协议将表挂载到系统表中,等待操作系统接管。

二、 硬件的双重描述

在 UEFI 和 ACPI 的开发中,“双重描述”是指同一个硬件资源(地址、中断、偏移)必须在两个互不统属的地方分别定义。

1.UEFI中,对硬件的描述主要在 .dsc 文件中的 PCD。主要给 UEFI 驱动用,决定了固件如何操作寄存器。

2.ACPI中,对硬件的描述主要在 .asl 源码。主要给 OS 内核用,告诉操作系统硬件在哪里。

0

评论 (0)

取消