UEFI 基础教程 (十六) - ACPI 简单使用

本文介绍ACPI源码ASL的编译流程,包括UEFI编译环境初始化、ASL源文件创建与编译过程。此外,还介绍了不同操作系统下ACPITable的转储方法及在UEFI中安装自定义ACPI表的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、ACPI source code ASL 编译流程

1. 初始化UEFI编译环境

edksetup.bat
在这里插入图片描述
在这里插入图片描述

2. 创建ASL源文件

  终端执行以下命令生成 csdn.asl.csdnhw.asl

echo '
DefinitionBlock ("csdn.asl","DSDT",2,"I优快云","PLATE优快云",3)
{

  #include "csdnhw.asl"
} // end of DSDT
' >> csdn.asl
echo '
Scope (\_SB) {
  Name(TEMP,0)   

  Device(csdndev) {
    Name(_HID,EISAID("PNP0C03"))
    #ifdef 优快云_ENABLE
      Name(_UID,"优快云RESV")
    #endif

    Method(_STA, 0)
    {
      Return (0)
    }
  }
}
' >> csdnhw.asl

在这里插入图片描述

3. 编译 ASL

1) 将ASL 预处理为.i 文件

Trim --asl-file -o csdn.i csdn.asl

在这里插入图片描述

2) 将.i 预处理为.iii 文件

"C:\Program Files (x86)\Microsoft Visual Studio 14.0\vc\bin\amd64\cl.exe" /nologo /E /C /D 优快云_ENABLE csdn.i > csdn.iii
在这里插入图片描述

3) 将.iii 预处理为.iiii 文件

Trim --source-code -l -o csdn.iiii csdn.iii
在这里插入图片描述

4) 将 .iiii 文件 编译为.aml文件

C:\ASL\iasl.exe -vr -oi -so csdn.iiii
在这里插入图片描述

5) 将 .aml 打包成.raw文件

GenSec -s EFI_SECTION_RAW -o csdn.raw csdn.aml
在这里插入图片描述

6) 将 .raw 打包成.ffs文件

GenFfs -t EFI_FV_FILETYPE_FREEFORM -g B4BA6241-936C-4485-A483-9FA832C758CA -o B4BA6241-936C-4485-A483-9FA832C758CA.ffs -oi csdn.raw
在这里插入图片描述
这一步其实可以省略掉,因为ACPI raw 文件会最终和efi,ui,depex 文件打包为 ffs. 参考如下定义:

[Rule.Common.DXE_RUNTIME_DRIVER.DRIVER_ACPITABLE]
 FILE DRIVER = $(NAMED_GUID) {
   DXE_DEPEX DXE_DEPEX Optional       $(INF_OUTPUT)/$(MODULE_NAME).depex
   PE32      PE32                     $(INF_OUTPUT)/$(MODULE_NAME).efi
   RAW ACPI  Optional                |.acpi
   RAW ASL   Optional                |.aml
   UI        STRING="$(MODULE_NAME)" Optional
   VERSION   STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER)
 }

二、 ACPI Table Dump

1. For Linux OS

  1. Install acpi-tools
    rpm -ivh http://mirrors.163.com/centos/8/BaseOS/x86_64/os/Packages/acpica-tools-20180629-3.el8.x86_64.rpm
    OR
    wget http://mirrors.163.com/centos/8/BaseOS/x86_64/os/Packages/acpica-tools-20180629-3.el8.x86_64.rpm yum install acpica-tools-20160527-3.el7.x86_64.rpm

  2. Dump all tables to xxx.dat
    acpidump > alltables.dat OR acpidump -o alltables.dat

  3. Extract all tables from text dat file
    # dump all tables from text output files, dsdt.dat, ssdt.dat
    acpixtract -a alltables.dat
    # gen xxx.dsl code from xxx.dat
    iasl -d dsdt.dat

PS:
或者直接
# de-compile DSDT to DSDT.dsl
cp -R /sys/firmware/acpi/tables/* .
iasl -d DSDT

2. For Win OS

RWEverything
或者
acpidump.exe -b ( acpi windwos tool download link: https://acpica.org/downloads/binary-tools)

3. For EFI SHELL

acpiDump.efi -b ( acpi efi tool download link: https://acpica.org/downloads/binary-tools)

三、Install ACPI Table for FW

  EFI_ACPI_TABLE_PROTOCOL        *AcpiTable;
  UINTN                          TableKey;
  EFI_ACPI_DESCRIPTION_HEADER    *Table.;
  UINTN                          TableSize;
  
  // 从efi所在的ffs中提取 aml section
  Status = GetSectionFromFv (
  &gEfiCallerIdGuid,
  EFI_SECTION_RAW,
  0,
  (VOID **) &Table,
  &TableSize
  );

//获取Acpi protocol
  Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID **) &AcpiTable);         
  TableKey = 0;
  CopyMem (Table->OemId, "优快云 " sizeof (Table->OemId) );
  Status = AcpiTable->InstallAcpiTable (
                        AcpiTable,
                        Table,
                        TableSize,
                        &TableKey
                        );

以下图示展示了将一个自定义的ACPI table 安装进UEFI并在UEFI shell dump,具体效果如下:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
Linux下AcpiDump具体效果如下:
在这里插入图片描述

四、Linux kernel create ACPI service flow

arch/x86/kernel/head64.S ->
  arch/x86/kernel/head64.c:x86_64_start_kernel() ->   
    arch/x86/kernel/head64.c:x86_64_start_reservations ->  
     init/main.c:start_kernel() -> 
        arch/x86/kernel/setup.c:setup_arch() ->  
                           acpi_boot_table_init() -> 
                             acpi_table_init() ->  
                         	  acpi_initialize_tables() ->   
                       		   acpi_os_get_root_pointer() ->   
                         	    acpi_find_root_pointer()

五、ACPI table 拓扑图

在这里插入图片描述
代码链接

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值