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。
从上述示例中可以看出,要进入S3状态,写入PM1 Control Grouping的PM1 Control寄存器的PM1a_CNT.SLP_TYP、PM1b_CNT.SLP_TYP的值为1。
[1]http://bochs.sourceforge.net/