5.3. ACPI 命名空间
对于所有定义块,系统维护一个用于引用对象的分层命名空间。所有定义块加载到相同的命名空间中。虽然这允许一个定义块引用另一个定义块的对象和数据(从而实现交互),但这也意味着 OEM 必须注意避免任何命名冲突。在大多数情况下,由于名称空间是分层的,因此通常动态定义文件的大部分将加载到层次结构的不同部分。命名空间的根和设计交互的某些位置是必须格外小心的区域。
尝试加载定义块时的名称冲突被认为是致命的。命名空间的内容仅在加载操作时更改。
命名空间本质上是分层的,每个名称都允许其“下方”的名称集合。以下命名约定适用于所有名称:
所有名称都是固定的 32 位。
名称的第一个字节包括:‘A’-‘Z’、‘_’、(0x41-0x5A、0x5F)。
名称的其余三个字节包括:‘A’-‘Z’、‘0’-‘9’、‘_’、(0x41-0x5A、0x30-0x39、0x5F)。
按照惯例,当 ASL 编译器填充短于 4 个字符的名称时,会在后面添加下划线 (‘_’)。请参阅《参考》章节中《AML》NameSeg 的语言定义。
本规范保留以“”开头的名称。定义块只能使用本规范定义的以“”开头的名称。
以“”开头的名称导致该名称引用命名空间的根(“”不是 32 位固定长度名称的一部分)。
以“^”开头的名称会导致该名称引用当前名称空间的父级(“^”不是 32 位固定长度名称的一部分)。
除了前面带有“”的名称之外,当前命名空间决定了正在创建的名称在命名空间层次结构中的位置以及在何处找到所引用的名称。通过在当前命名空间中查找匹配的名称,然后在父命名空间中查找匹配的名称来定位名称。如果父命名空间不包含该名称,则继续向上递归搜索,直到找到该名称或命名空间没有父命名空间(命名空间的根)。这表明未找到该名称 - 除非正在执行的操作明确准备好名称解析失败,否则这将被视为错误并可能导致系统停止工作。
尝试访问根的父级中的名称将导致找不到该名称。
命名空间路径有两种类型:绝对命名空间路径(即以“”前缀开头的路径)和相对命名空间路径(即相对于当前命名空间的路径)。上面讨论的命名空间搜索规则仅适用于单个 NameSeg 路径,即相对命名空间路径。对于那些包含多个 NameSeg 或父前缀“^”的相对名称路径,搜索规则不适用。如果搜索规则不适用于相对命名空间路径,则相对于当前命名空间查找命名空间对象。例如:
ABCD //search rules apply
^ABCD //search rules do not apply
XYZ.ABCD //search rules do not apply
\\XYZ.ABCD //search rules do not apply
所有名称引用都使用 32 位固定长度名称或使用名称扩展前缀将多个 32 位固定长度名称组件连接在一起。这对于引用不在当前命名空间范围内的对象名称(例如控制方法)非常有用。
名称路径主要用于两个目的:
引用现有对象。在这种情况下,名称路径中的所有 NameSeg 必须已存在。
创建一个新对象。例如:
Device (XYZ.ABCD) {...} OperationRegion (\XYZ.ABCD, SystemMemory, 0, 0x200)
这些声明中的每一个都旨在根据以下规则创建一个名为ABCD的新对象:
对象XYZ必须已经存在才能创建ABCD对象
如果XYZ不存在,将导致致命错误
一般来说,只有最终的 Nameseg 才会用作新对象的名称。如果名称路径中的任何其他 Nameseg 不存在,则这是一个致命错误。从这个意义上说,名称路径类似于文件系统中的文件路径名,由一定数量的现有目录后跟最终文件名组成。
下图显示了加载差分定义块后 ACPI 命名空间的示例。
图 5.16 示例ACPI 命名空间
由于命名空间搜索规则,使用相对单段名称访问命名空间对象时必须小心。访问相对对象的尝试会向根递归,直到找到该对象或遇到根。这可能会导致意外的结果。例如,使用图 5.5 中描述的命名空间,尝试从 \SB.PCI0.IDE0 中访问 _CRS 命名对象将产生不同的结果,具体取决于使用的是绝对路径名还是相对路径名。如果指定绝对路径名 (SB.PCI0.IDE0._CRS),则会出现错误,因为该对象不存在。使用单个段名称 (_CRS) 的访问实际上将访问 \SB.PCI0._CRS 对象。请注意,访问将成功进行,不会出现任何错误。
5.3.1. 预定义的根命名空间
以下命名空间在命名空间根下定义。
表 5.148 命名空间根下定义的命名空间描述 ---|--- \_GPE |一般事件位于GPE寄存器块中。 \_PR | ACPI 1.0 处理器命名空间。 ACPI 1.0 要求所有处理器对象都在此命名空间下定义。 ACPI 2.0 及更高版本允许在 \_SB 命名空间下定义处理器对象。平台可能会维护_PR命名空间以与ACPI1.0 操作系统兼容,但它已被弃用。请参阅_处理器本地 x2APIC 结构_中的兼容性说明。与ACPI兼容的命名空间可以在_SB或_PR范围中定义处理器对象,但不能同时在两者中定义。有关定义处理器对象的更多信息,请参阅处理器配置和控制。 \_SB |所有设备/总线对象都在此命名空间下定义。 \_SI |系统指示器对象定义在此命名空间下。有关定义系统指示器的详细信息,请参阅\_SI 系统指示器。 \_TZ | ACPI 1.0 热区命名空间。 ACPI 1.0 要求所有Thermal Zone 对象都在此命名空间下定义。现在可以在 \_SB 命名空间下定义热区域对象定义。 ACPI兼容系统可以维护_TZ命名空间,以便与ACPI1.0 操作系统兼容。与ACPI兼容的命名空间可以在_SB或_TZ范围中定义热区对象,但不能同时在两者中定义。有关定义热区域对象的更多信息,请参阅热管理。
5.3.2. 对象
除局部对象外,所有对象都具有全局作用域。本地数据对象具有每次调用的作用域和生存期,用于从头到尾处理当前的调用。
物体的内容差异很大。然而,大多数对象指的是任何支持的数据类型的数据变量、控制方法或系统软件提供的功能。
对象可能包含修订字段。连续的ACPI规范定义了对象修订版,以便它们向后兼容支持先前规范/对象修订版的OSPM实现。新的对象字段添加到先前对象定义的末尾。 OSPM 根据对象支持的修订版号(包括所有早期修订版)解释对象。因此,OSPM预计对象的长度可以大于或等于已知对象修订版本的长度。当评估版本号大于OSPM已知版本号的对象时,OSPM会忽略超出已知版本定义的对象字段范围的内部对象字段值。
