4.3. 通用硬件编程模型
尽管固定硬件编程模型要求硬件寄存器定义在特定地址位置,但通用硬件编程模型允许硬件寄存器驻留在大多数地址空间中,并为系统 OEM 在硬件中实现特定功能提供了高度灵活性。OSPM 直接访问固定硬件寄存器,但依赖 OEM 提供的 ACPI 机器语言(AML)代码来访问通用硬件寄存器。
AML 代码使 OEM 能够为 OSPM 提供控制通用硬件特性的控制逻辑和事件逻辑的方法。
标题为“ACPI 源语言参考”的章节描述了 ACPI 源语言(ASL)——一种 OEM 用来创建 AML 的编程语言。ASL 语言提供了许多常见面向对象编程语言中的运算符,但它经过了优化,以便能够描述平台电源管理和配置硬件。ASL 编译器将 ASL 源代码转换为 AML,AML 是一种非常紧凑的机器语言,由 ACPI AML 代码解释器执行。
AML 做两件事:
将硬件从 OSPM 中抽象出来
在 OEM 代码与不同 OS 实现之间提供缓冲
ACPI 的一个目标是允许 OEM 的“增值”硬件在 ACPI 配置中基本保持不变。增值硬件的一个属性是其实现方式各不相同。为了使 OSPM 能够在不同类型的增值硬件上正确执行,ACPI 定义了更高层次的“控制方法”,并通过调用这些方法来执行操作。OEM 提供与控制方法相关联并由 OSPM 执行的 AML 代码。通过提供 AML 代码,通用硬件几乎可以采用任何形式。
ACPI 的另一个重要目标是提供 OS 独立性。为此,OEM 的 AML 代码必须能够在任何兼容 ACPI 的 OS 下以相同方式执行。ACPI 通过将 AML 代码解释器作为 OSPM 的一部分来实现这一点。这使 OSPM 能够处理各特定 OS 所特有的同步和阻塞问题。
通用特性模型如下框图所示。在该模型中,通用特性通过 AML 代码向 OSPM 描述。该描述采用对象的形式,位于与其增值硬件相关联的 ACPI 命名空间中。

图 4.1 通用硬件特性模型
作为通用硬件控制特性的一个示例,平台可能被设计为使 IDE HDD 的 D3 状态具有用于切断驱动器电源的增值硬件。然后,IDE 驱动器将在其命名空间中具有对 AML PowerResource 对象(其控制增值电源平面)的引用,并且与该对象关联的是由 OSPM 调用以控制驱动器 D3 状态的控制方法:
_PS0:一种控制方法,用于将 IDE 驱动器按顺序切换到 D0 状态。
_PS3:一种控制方法,用于将 IDE 驱动器按顺序切换到 D3 状态。
_PSC:一种控制方法,返回 IDE 驱动器的状态(开或关)。
此对象下的控制方法在 OSPM 与硬件之间提供了一个抽象层。OSPM 通过其定义的 PowerResource 对象理解如何控制电源平面(将其打开或关闭,或获取其状态),而硬件则具有平台特定的 AML 代码(包含在相应的控制方法中)来执行所需功能。在此示例中,平台将通过在 _PS3 控制方法中编写并放置用于关闭硬件的 AML 代码,向 ACPI OS 描述其硬件。这使得能够进行如下顺序:
当 OSPM 决定将 IDE 驱动器置于 D3 状态时,它会调用 IDE 驱动程序并通知其将驱动器置于 D3 状态(此时驱动程序保存设备的上下文)。
当 IDE 驱动程序返回控制权后,OSPM 将驱动器置于 D3 状态。
OSPM 查找与 HDD 关联的对象,然后在该对象中查找与 D3 状态关联的任何 AML 代码。
OSPM 执行适当的 _PS3 控制方法,以控制这种增值的“通用”硬件,从而将 HDD 置于更低的功耗状态。
作为通用事件功能的一个示例,平台可能具有对接能力。在这种情况下,它将希望生成一个事件。请注意,所有 ACPI 事件都会生成一个 SCI,而该 SCI 可以映射到任何可共享的系统中断。在对接的情况下,当检测到已发生对接或当用户请求将系统取消对接时,就会生成该事件。这使得能够进行如下顺序:
OSPM 响应该 SCI,并调用与该通用事件关联的 AML 代码事件处理程序。ACPI 表将硬件事件与 AML 代码事件处理程序相关联。
AML 代码事件处理程序收集适当的信息,然后执行一个 AML Notify 命令,以向 OSPM 指示某个特定总线需要重新枚举。
以下各节描述 ACPI 的固定硬件和通用硬件功能集。这些章节使读者能够理解以下内容:
当平台类别的设计指南要求某个 ACPI 功能、概念或接口时,哪些硬件寄存器是必需的或可选的
如何设计固定硬件功能
如何设计通用硬件功能
ACPI 事件模型