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

一、ACPI source code ASL 编译流程

1. 初始化UEFI编译环境

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

2. 创建ASL源文件

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

echo '
DefinitionBlock ("csdn.asl","DSDT",2,"ICSDN","PLATECSDN",3)
{

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

  Device(csdndev) {
    Name(_HID,EISAID("PNP0C03"))
    #ifdef CSDN_ENABLE
      Name(_UID,"CSDNRESV")
    #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 CSDN_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, "CSDN " 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 拓扑图

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

### 回答1: ACPI(高级配置和电源接口)是现代计算机系统中负责管理硬件和电源的重要组件。编写ACPI编程代码是深入了解和掌握系统的关键。 ACPI编程的入门首先需要了解ACPI的原理和基本概念。ACPI主要包括了ACPI表、ACPI命名空间、ACPI方法、ACPI设备和ACPI事件等组件。其中最重要的是ACPI表,它是存储ACPI配置和信息的数据结构,在操作系统启动时由固件(如BIOS或UEFI)提供。 接下来,我们需要学习如何使用UEFI提供的接口来访问ACPI表。UEFI是用于取代传统BIOS的新一代固件接口标准,它提供了许多用于操作硬件的接口函数。在UEFI内核导读中,我们可以学习到如何使用UEFI提供的接口函数,如GetSystemTable和LocateProtocol来获取ACPI表。 一旦获取了ACPI表,就可以使用ACPI编程来操作和管理系统的硬件。我们可以通过解析ACPI表的结构和字段来获取硬件信息,如处理器、硬盘和显卡等。同时,ACPI编程还可以用于配置和控制硬件,如设置电源管理策略、启用和禁用设备等。 在ACPI编程入门中,我们也需要学习如何处理ACPI事件。ACPI事件是指硬件状态或系统事件的通知,如按键事件、电源事件和温度事件等。通过注册和处理ACPI事件,我们可以编写更加智能和灵活的系统管理代码。 最后,了解ACPI编程的最佳实践和调试技巧也是非常重要的。ACPI编程常常需要谨慎处理硬件和系统的复杂逻辑,同时需要进行灵活的错误处理。熟悉ACPI规范和文档,以及使用调试工具来分析和解决问题,都是提高ACPI编程效率和质量的关键。 总之,ACPI编程是一项重要而复杂的任务,通过学习UEFI内核导读中的ACPI编程入门知识,我们可以更好地了解和掌握ACPI的原理和操作方法,为开发和管理现代计算机系统提供强大的工具和技术支持。 ### 回答2: 《UEFI内核导读》中的ACPI编程入门章节主要介绍了在UEFI环境下进行ACPI编程的基础知识和技巧。ACPI (Advanced Configuration and Power Interface) 是一种用于操作系统和硬件之间通信的标准接口,它定义了电源管理、设备配置和配置信息传递等功能。 ACPI编程的入门主要包括以下内容: 1. ACPI的概述:介绍了ACPI的基本概念、作用和结构,说明了在UEFI中如何使用ACPI来进行设备配置和管理。 2. ACPI表:解释了ACPI表的类型和作用,如DSDT(Differentiated System Description Table)、SSDT(Secondary System Description Table)等,以及如何在UEFI中获取和使用这些表。 3. AML语言:AML(ACPI Machine Language)是一种用于编写ACPI表的高级语言,介绍了AML的基本语法和常用指令,以及如何在UEFI中加载和执行AML代码。 4. 设备电源管理:讲解了如何使用ACPI进行设备电源管理,包括睡眠、唤醒和电源状态转换等操作。 5. 事件和中断处理:说明了如何使用ACPI来处理系统事件和中断,以及如何编写ACPI方法来响应这些事件和中断。 通过学习这些内容,读者可以掌握在UEFI环境下进行ACPI编程的基础知识和技巧。ACPI编程在UEFI开发中起着重要的作用,对于实现系统设备管理和电源管理等功能非常重要,对于理解和使用UEFI内核也具有重要意义。 ### 回答3: acpi(高级配置和电源接口)是一种被广泛使用在现代计算机系统中的标准,用于管理硬件设备的电源管理和配置信息。在UEFI(统一可扩展固件接口)内核导读中,acpi编程入门是其中一个重要的主题。 acpi编程入门的目的是让开发者了解如何使用acpi来控制硬件设备的电源管理和配置操作。acpi提供了一组标准的接口和语言,使开发者可以编写具体的acpi代码来实现特定的功能。通过acpi编程,开发者可以实现诸如电源管理、设备状态监控和系统配置等功能。 在acpi编程入门中,首先需要了解acpi的基本概念和架构。acpi的核心是acpi表,它包含系统的配置信息和控制信息。开发者需要了解如何解析和读取acpi表,以获取系统的配置信息。同时,了解acpi命名空间和对象模型,可以帮助开发者理解acpi中的各个组件和其关系。 在实际的acpi编程中,开发者需要学习acpi语言(ASL)和acpi命令(AML)。ASL是一种类似于C语言的高级语言,用于编写acpi代码。AML是一种二进制格式的编码,用于实际执行acpi代码。了解如何编写和编译ASL代码,并将其转换为AML代码是开发者的关键任务。 此外,理解acpi的工作原理和常见的acpi编程技巧也是入门的重要内容。开发者需要知道如何注册和操作acpi设备,如何监听和处理acpi事件,以及如何控制电源状态和硬件配置。 总之,在UEFI内核导读中,acpi编程入门是为开发者提供的一项重要教学内容。通过学习acpi编程,开发者可以更好地理解和掌握UEFI系统中的电源管理和硬件配置操作。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值