ACPI数据表和表定义

484 阅读2分钟

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

简介

这里主要是ACPI数据表及其定义语言。

一、ACPI 数据表和表定义语言

有两种基本类型的ACPI表:

  • 包含从ACPI源语言(ASL)产生的AML代码的表格。这些表包括DSDT,任何SSDT,有时还有OEM专用表(OEMx)。

  • 包含简单数据和没有AML字节码的表。这些类型的表被称为ACPI数据表。它们包括诸如FADT、MADT、ECDT、SRAT等表。-基本上除了DSDT或SSDT以外的任何表。

  • 第一种类型的表是用ASL编译器生成的。

  • 第二种类型的表,即ACPI数据表,是由本节讨论的。

本节介绍了一种简单的语言(表定义语言或TDL),可以用来生成任何ACPI数据表。它简化了BIOS供应商的表格生成过程,并且可以自动生成字段,如表长、子表长、校验和、标志字段等。

二、 ACPI数据表格的类型

在表定义语言(TDL)的编译器中,有两种ACPI数据表的类型:

  • 编译器 "知道"的ACPI表。这些表通常包括ACPI规范中定义的所有基本ACPI规范中定义的所有基本ACPI表,如FADT、MADT、ECDT等。由于这些表是完全指定的(通常通过ACPI规范,但也有其他来源),TDL编译器知道这些表的所有细节--包括所有需要的数据类型。可选或必需的子表等。
  • 编译器不知道的ACPI表。这些表可能包括在ACPI规范中没有定义的表,如MCI表。这些表可能包括ACPI规范中没有定义的表,如MCFG、DBGP等或者只是新的ACPI表,尚未在编译器中实现。

三、ACPI表定义语言规范

下面的部分定义了ACPI表定义语言(TDL)。语法符号 遵循与ASL源语言相同的规则。各种数据类型的完整定义遵循语法规范。

表定义语言

大多数ACPI表共享以下结构(除了FACS):

  • 一个普通的36字节的头,包含表的签名、长度、校验和、修订和其他数据。
  • 一个包含特定表数据的表体。

表定义语言允许通过一个字段的集合来定义ACPI表。TDL源代码的每一行都是一个字段,并与表定义中的一个数据项相对应。

例如,普通ACPI表头的C语言定义如下:

typedef struct acpi_table_header
{
    char Signature[4];
    UINT32 Length;
    UINT8 Revision;
    UINT8 Checksum;
    char OemId[6];
    char OemTableId[8];
    UINT32 OemRevision;
    char AslCompilerId[4];
    UINT32 AslCompilerRevision;
} ACPI_TABLE_HEADER;

在表定义语言中,一个ACPI表头描述如下:

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

四、完结

本章未完结,待续。