一、 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 管理电源)。
最终使用AmlFindNode、AmlDetachNode、AmlNameOpUpdateInteger,查找acpi表的相关节点,进行删除、更新操作。
3.校验与交付
修补完成后,重新计算 Checksum(校验和),最后通过 InstallAcpiTable 协议将表挂载到系统表中,等待操作系统接管。
二、 硬件的双重描述
在 UEFI 和 ACPI 的开发中,“双重描述”是指同一个硬件资源(地址、中断、偏移)必须在两个互不统属的地方分别定义。
1.UEFI中,对硬件的描述主要在 .dsc 文件中的 PCD。主要给 UEFI 驱动用,决定了固件如何操作寄存器。
2.ACPI中,对硬件的描述主要在 .asl 源码。主要给 OS 内核用,告诉操作系统硬件在哪里。
评论 (0)