怎么在 TDL中 定义一个 ACPI 表?

195 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情

简介

最近由于工作遇到的问题,提出了一个问题,怎么才能在TDL中新建一个未知 ACPI 表或者一个已知的 ACPI 表呢?

一、 在 TDL 中定义一个新的 ACPI 表

提出问题

怎么新建一个未知的ACPI表呢?

解决思路

对于新的或编译器不知道其格式的ACPI表,引入了一个新的概念,称为 "通用 "数据类型,他允许使用显式数据类型来定义这些表。所以我们可以使用这“通用”数据类型来新建一个表。

操作方法

Label : StartRecord
UINT8 : 11
UINT16 : $EndRecord - $StartRecord      // Record length
UINT24 : 112233
UINT32 : 11223344
UINT56 : 11223344556677
UINT64 : 1122334455667788
String : "This is a string"
DevicePath : "\PciRoot(0)\Pci(0x1f,1)\Usb(0,0)"
Unicode : "This string will be encoded to Unicode"
Buffer : AA 01 32 4C 77
GUID : 11223344-5566-7788-99aa-bbccddeeff00
Label : EndRecord

二、 在 TDL 中定义一个已知的 ACPI 表

提出问题

怎么新建一个已知的ACPI表呢?

解决思路

预计大多数将通过TDL编译器创建的ACPI表是编译器已知的ACPI表。这意味着编译器包含所需的结构和表的定义,根据ACPI规范或该表的其他规范。对于这些已知的ACPI表,指定表的数据包括简单地定义表中的每个字段的值。编译器会自动输入数据,执行范围和任何值的检查,并生成适当的输出。检查,并产生适当的输出。

任何已知的ACPI表的起点是指定表的格式的文件(通常是ACPI规范)。表的格式的文件(通常是ACPI规范),或由ASL编译器生成的表模板文件,或甚至是一个AML反汇编器的输出。编写TDL代码涉及到实现一行为表定义中指定的每个数据项实现一行代码。例如,ACPI表的表头可以被定义为简单的字符串和整数的序列。TDL编译器将把这些数据项格式化为一个36字节的ACPI表头。

操作方法

    : "ECDT"
    : 00000000
    : 01
    : 00
    : "OEM "
    : "MACHINE1"
    : 00000001
    : ""
    : 00000000

三、完结

本文结束,撒花。