3.设计详述
本小节包含适用于ACPICA子系统两大部分的概念,数据类型和数据结构。
3.1 ACPI命名空间基础
ACPI命名空间是一个大的数据结构,它是由ACPICA子系统创建和管理的。它是根据DSDT表创建的,命名空间是一个由ACPI对象组成的分层结构。
3.1.1 对象
每一个在命名空间中的对象都有一个4字节长的名字。根节点使用反斜杠作为路径名的第一个字符。路径名是以多个4字节长的对象名组成,这些对象名字使用“.”作为分隔符。
3.1.2Scopes
Scope这个概念直接与ASL相关,ASL会对对象进行定义和描述。对象的Scope被定义为紧跟着对象后的花括号内的内容。换句话说,一个对象的Scope是这个对象的子对象的容器。
在ACPICA的很多接口中,定义一个表示这一个容器的Scope参数会很方便。比如说,当将一个ACPI名字转换为对象handle的时候需要两个参数,名字本身和包含名字的Scope。当在Scope中发现匹配到名字的对象,这个对象的handle将会被返回。
3.1.2.1命名空间的Scopes、名字和对象的例子
下面的ASL代码中,对象_GPE的scope包含对象_L08和_L0A
Scope (\_GPE)
{
Method (_L08)
{
Notify (\_SB.PCI0.DOCK, 1)
}
Method (_L0A)
{
Store (0, \_SB.PCI0.ISA.EC0.DCS)
}
}
在本例中存在三个ACPI命名空间对象,详细说明如下:
三个对象的名字是_GPE,_L08和_L0A.
父对象_GPE的子对象为_L08和_L0A.
对象_L08的绝对路径名(完整的路径名)是“\_GPE._L08”.
对象_GPE的scope包含对象_L08和_L0A.
控制方法_L08和_L0A的scope中包含可执行的AML代码.
包含对象_L08的scope为_GPE的scope.
对象_GPE为对象_L08和_L0A的父对象。
对象_L08和_L0A的类型都是ACPI_TYPE_METHOD.
对象_L08的下一个对象(兄弟对象)是对象_L0A.在本例的_GPE的scope中对象_L0A后没有其他的对象.
由于对象_GPE是处于根这一层下的一个命名空间对象(如对象名字前的斜杠所示),它的父对象是根对象,包含它的scope是根的scope。
3.1.3预定义对象
在初始化ACPICA子系统内部命名空间的时候,有几个预定义的对象,它们总是会被注册并被安装到命名空间中,不管它们出现在哪一个被装载的ACPI表中。这些对象和它们所属的类型如下所示。
“_GPE”, ACPI_TYPE_ANY // General Purpose Event block
“_PR_”, ACPI_TYPE_ANY // Processor block
“_SB_”, ACPI_TYPE_ANY // System Bus block
“_SI_”, ACPI_TYPE_ANY // System Indicators block
“_TZ_”, ACPI_TYPE_ANY // Thermal Zone block
“_REV”, ACPI_TYPE_NUMBER // Supported ACPI specification revision
“_OS_”, ACPI_TYPE_STRING // OS Name
“_GL_”, ACPI_TYPE_MUTEX // Global Lock
“_OSI”, ACPI_TYPE_METHOD // Query OS Interfaces
3.1.4命名空间的逻辑分布
下图表示预定义对象和_GPE的scope被加入后,命名空间的逻辑分布。