ACPI 中文文档ACPI 中文文档
首页
第 1 章
第 2 章
第 3 章
第 4 章
第 5 章
第 6 章
第 7 章
第 8 章
第 9 章
第 10 章
第 11 章
第 12 章
第 13 章
第 14 章
第 15 章
第 16 章
第 17 章
第 18 章
第 19 章
第 20 章
第 21 章
附录 A
首页
第 1 章
第 2 章
第 3 章
第 4 章
第 5 章
第 6 章
第 7 章
第 8 章
第 9 章
第 10 章
第 11 章
第 12 章
第 13 章
第 14 章
第 15 章
第 16 章
第 17 章
第 18 章
第 19 章
第 20 章
第 21 章
附录 A
  • 第 5 章

    • 总览
    • 5.1. 系统描述表架构概述
    • 5.2. ACPI 系统描述表
      • 5.2.1. 保留位和字段
      • 5.2.2. 兼容性
      • 5.2.3. 地址格式
      • 5.2.4. 通用唯一标识符 (UUID)
      • 5.2.5. 根系统描述指针 (RSDP)
      • 5.2.6. 系统描述表头
      • 5.2.7. 根系统描述表 (RSDT)
      • 5.2.8. 扩展系统描述表 (XSDT)
      • 5.2.9. 固定 ACPI 描述表 (FADT)
      • 5.2.10. 固件 ACPI 控制结构 (FACS)
      • 5.2.11. 定义块
      • 5.2.12. 多个APIC描述表(MADT)
      • 5.2.13. 全局系统中断
      • 5.2.14. 智能电池表 (SBST)
      • 5.2.15. 嵌入式控制器启动资源表 (ECDT)
      • 5.2.16. 系统资源关联表 (SRAT)
      • 5.2.17. 系统局部性信息表 (SLIT)
      • 5.2.18. 更正平台错误轮询表 (CPEP)
      • 5.2.19. 最大系统特性表 (MSCT)
      • 5.2.20. ACPI RAS 功能表 (RASF)
      • 5.2.21. 内存电源状态表 (MPST)
      • 5.2.22. 启动图形资源表 (BGRT)
      • 5.2.23. 固件性能数据表 (FPDT)
      • 5.2.24. 通用定时器描述表 (GTDT)
      • 5.2.25. NVDIMM 固件接口表 (NFIT)
      • 5.2.26. 安全设备 (SDEV) ACPI 表
      • 5.2.27. 异构内存属性表(HMAT)
      • 5.2.28. 平台调试触发器表 (PDTT)
      • 5.2.29. 处理器属性拓扑表 (PPTT)
      • 5.2.30. 平台健康评估表 (PHAT)
    • 5.3. ACPI 命名空间
    • 5.4. 定义块编码
    • 5.5. 控制方法和 ACPI 源语言 (ASL)
      • 5.5.1. ASL 报表
      • 5.5.2. 控制方法执行
        • 5.5.2.1. 论点
        • 5.5.2.2. 方法调用约定
        • 5.5.2.3. 局部变量和本地创建的数据对象
        • 5.5.2.4. 进入运营区域
          • 5.5.2.4.1. 运营地区
          • 5.5.2.4.2. CMOS 协议
          • 5.5.2.4.3. PCI 设备 BAR 目标协议
          • 5.5.2.4.4. 声明IPMI运营区域
          • 5.5.2.4.5. 声明 GeneralPurposeIO 操作区域
          • 5.5.2.4.6. 声明 GenericSerialBus 操作区域
            • 5.5.2.4.6.1. 声明 GenericSerialBus 字段
            • 5.5.2.4.6.2. 声明和使用 GenericSerialBus 数据缓冲区
            • 5.5.2.4.6.3. 使用通用串行总线协议
          • 5.5.2.4.7. 声明PCC运营区域
    • 5.6. ACPI 事件编程模型
      • 5.6.1. ACPI 事件编程模型组件
      • 5.6.2. ACPI 事件类型
      • 5.6.3. 固定事件处理
      • 5.6.4. 通用事件处理
      • 5.6.5. GPIO 信号 ACPI 事件
      • 5.6.6. 设备对象通知
      • 5.6.7. 设备类特定对象
      • 5.6.8. 对象、方法和资源的预定义ACPI名称
      • 5.6.9. 中断信号ACPI事件
      • 5.6.10. 使用设备 _PRW 对象管理唤醒事件
    • 5.7. 预定义对象
    • 5.8. 系统配置对象

5.4. 定义块编码

本节指定定义块中用于定义名称(仅加载时间)、对象和包的编码。

5.4.1. AML 编码

定义块从头到尾被编码为流。流中的前导字节来自 ACPI 源语言 (ASL) 参考 中显示的 AML 编码表,表示如何解释一定数量的后续字节,其中每个后续字节又可以表示如何解释一定数量的后续字节。有关 AML 编码的完整规范,请参阅 ACPI 源语言 (ASL) 参考

在流中定义了两个级别的数据。一个是打包和对象声明(加载时),另一个是对象引用(包内容/运行时)。

所有编码都是这样的,编码的前导字节表示所进行的声明或引用的类型。该类型在流中具有隐式或显式长度。所有显式长度声明均采用如下所示的形式,其中 PkgLength 是操作数据的包含长度的长度。

../_images/AML_encoding.PNG

图 5.17AML 编码

隐式长度对象的编码要么具有固定长度编码,要么允许嵌套编码,在某些时候,这会导致显式或隐式固定长度。

PkgLength 在流中被编码为一系列 1 到 4 个字节,最高有效两位为字节零,指示 PkgLength 编码中有多少个后续字节。接下来的两位仅用于一字节编码,这允许长度最大为 0x3F 的一字节编码。不使用这两个位的较长编码的最大长度如下:两字节编码 0x0FFF、三字节编码 0x0FFFFF 和四字节长度编码 0x0FFFFFFFF。

包长度不落在逻辑边界上是致命的。例如,如果一个包包含在另一个包中,则根据定义,其长度必须包含在外包内,对于隐式长度的数据也是如此。

5.4.2. 定义块加载

在某个时刻,系统软件决定“加载”定义块。当系统传递数据并填充ACPI命名空间并相应地初始化对象时,加载就完成了。发生填充的命名空间要么来自当前命名空间位置(由所有嵌套包定义),要么来自根(如果名称前面带有“”)。

定义块中出现的第一个对象必须是命名的控制方法。这是定义块的初始化控制。

包是包含对一个或多个对象的有序引用的对象。包也可以被视为数组的顶点,包中包含的任何对象都可以是另一个包。这允许固定或动态深度和顶点的多维数组。

未命名对象用于填充命名对象的内容。无法在“根”中创建未命名的对象。未命名的对象可以用作控制方法中的参数。

创建对象时控制方法执行可能会产生错误。如果创建命名对象的方法阻塞并在阻塞时重新进入,则可能会发生这种情况。发生这种情况是因为所有命名对象都有绝对路径。即使指定的对象名称是相对的,也是如此。例如,以下ASL代码段在功能上是相同的。

Method (DEAD)
{
    Scope (\_SB_.FOO)
    {
        Name (BAR,0x1234) // Run time definition
    }
}
Scope (\_SB_)
{
    Name (\_SB_. FOO.BAR,) // Load time definition
}

请注意,在上面的示例中,DEAD 方法的执行始终会失败,因为对象 \SB.FOO.BAR 是在加载时创建的。

术语“定义块级”用于指不包含在任何控制方法中的AML字节流。此类AML字节流可以出现在“根”范围中或由“Device、PowerResource、Processor、Scope 和 ThermalZone”操作符创建/打开的范围中。详细说明请参见“ASL操作员参考、ASL操作员参考”。

定义块级别不仅允许命名对象,还允许所有术语对象(数学、逻辑和条件表达式等,请参阅“术语对象编码,术语对象编码”)。在定义块级别允许此类可执行AML操作码允许BIOS编写者根据系统设置定义动态对象列表。例如:

DefinitionBlock ("DSDT.aml", "DSDT", 2, "OEM", "FOOBOOK", 0x1000)
{
    ...
    If (CFG1 () == 1))
    {
        ...
        Scope (_SB.PCI0.XHC.RHUB)
        {
            ...
            If (CFG2 () == 1)
            {
                ...
                Device (HS11)
                {
                    ...
                    If (CFG3 () == 1)
                    {
                        ...
                        Device (CAM0)
                        {
                        ...
                        }
                        ...
                    }
                    ...
                }
                ...
            }
            ...
        }
        ...
    }
    ...
}

定义块加载期间对定义块的解释与控制方法执行期间对控制方法的解释类似。

Prev
5.3. ACPI 命名空间
Next
5.5. 控制方法和 ACPI 源语言 (ASL)