ACPI命名空间和AML(ASL)

ACPI命名空间是定义块的层次性命名空间,所有定义块都被读入相同命名空间中。因此可以在命名空间内从其他位置参照对象或数据,但必须注意名称不要重复。下面介绍ACPI命名空间的命名规则。

ACPI命名空间的命名规则

·所有名称的长度为固定长度32位

·第一个字节为‘A’~‘Z’、‘_’(0x41~0x5A、0x5F)

·其他3个字节为‘A’~‘Z’、‘0’~‘9’、‘_’(0x41~0x5A、0x30~0x39、0x5F)

·ASL编译器为了将4个字以下的名称改为4个字,而添加‘_’。

·以‘_’开头的名称在ACPI的说明书中预留。

·以‘\’开头的名称就是参照命名空间的root的名称(‘\’不包括在32位固定长度的名称中)。

·以‘^’开头的名称就是参照当前命名空间的上一层的名称(‘^’不包括在32位固定长度的名称中)。

另外,写BIOS的人使用ASL语言来描述这个定义块。将使用ASL写出的源代码编译,就可以生成AML的二进制码。操作系统通过执行这个AML的代码,来读取、写入定义块的系统结构。关于ASL的解释非常复杂,本书只作简单的介绍。

ASL

ASL是用来定义ACPI对象的语言。在ASL语言中,ACPI对象由ObjectType、FixedList、VariableList这三者来定义。FixedList和VariableList存在null的情况。

Object:=ObjectType FixedList VariableList

Object ACPI对象

ObjectType ACPI对象的类型

FixedList通过固定长度的列表来表示ObjectType的实例。表示为(a, b,c,……)

VariableList通过非固定长度的列表来表示子对象。表示为{x, y,z, aa, bb, cc}

例如,查看Bochs emulator[1]的DSDT。以下为_S3对象的部分。


Name(_S3,Package(0x04)

{

0x01,/PM1a_CNT.SLP_TYP/

0x01,/PM1b_CNT.SLP_TYP/

Zero,/reserved/

Zero/reserved/

})


Name()生成名为_S3的对象。Package()的使用方法如下:


Package(NumElements){PackageList}


在Package()中,ObjectType为Package, NumElements为FixedList, PackageList为VariableList。NumElements(0x4)表示PackageList的数量,用PackageList的值初始化_S3。_Sx对象定义见表6-10。

ACPI命名空间和AML(ASL) - 图1

从上述示例中可以看出,要进入S3状态,写入PM1 Control Grouping的PM1 Control寄存器的PM1a_CNT.SLP_TYP、PM1b_CNT.SLP_TYP的值为1。

[1]http://bochs.sourceforge.net/