5.2.3. 地址格式
ACPI 1.0 系统描述表中使用的地址表示为系统内存或 I/O 空间。这是针对IA-32环境的。较新的架构需要超出ACPI1.0 中定义的寻址机制。为了支持这些架构,ACPI必须支持 64 位寻址,并且必须允许将控制寄存器放置在系统 I/O 以外的地址空间中。
5.2.3.1. 功能固定硬件
ACPI将固定硬件低级接口定义为向系统OEM传达实现主板配置和系统电源管理的能力和质量水平所需的最小接口的方法。此外,这些接口的定义以及本规范中定义的其他接口的定义,向开发ACPI兼容操作系统的OS供应商 (OSV) 传达了操作系统必须操作的必要接口,以便为系统配置和电源管理提供强大的支持。
虽然ACPI1.0定义的低级硬件接口的定义为OSPM实现提供了一定程度的稳定性,但该模型无法适应现有和新兴的多样化CPU架构的控制,因为它们可能需要与本机CPU指令混合的一系列硬件操作,以提供ACPI定义的接口功能。在这种情况下,ACPI定义的固定硬件接口可以由CPU制造商通过硬件和软件的等效组合在功能上实现,并由ACPI定义为功能固定硬件。
在基于IA-32的系统中,功能固定硬件可以通过使用基于系统管理模式(SMM)的系统固件以OS独立的方式容纳。不幸的是,基于SMM的代码的性质使得这种类型的OS独立实现即使不是不可能调试也很困难。因此,不推荐这种实现方法。在某些情况下,功能固定硬件实施可能需要与其他OS组件协调。因此,OS独立实施可能不可行。
OS功能固定硬件的特定实现可以使用CPU制造商提供的技术信息来实现。这种方法的缺点是必须为每个OS开发功能固定硬件支持。在某些情况下,CPU制造商可能会提供提供此支持的软件组件。在其他情况下,对功能性固定硬件的支持可以由OS供应商直接开发。
在ACPI2.0 中,硬件寄存器定义得到了扩展,允许寄存器存在于系统 I/O 地址空间以外的地址空间中。这是通过在寄存器定义中指定地址空间ID来完成的(有关更多信息,请参阅通用地址结构)。当CPU制造商明确指示时,系统固件可以通过在寄存器定义的地址空间ID字段中指示 0x7F(功能固定硬件)来将接口定义为功能固定硬件。需要强调的是,功能固定硬件定义只能按照CPU制造商针对特定接口的指示在ACPI系统固件中声明,因为使用功能固定硬件需要与OS供应商进行具体协调。
只有某些ACPI定义的接口可以使用功能固定硬件来实现,并且仅当这些接口在机器设计中通用时,例如,共享通用CPU架构的系统不支持ACPI定义的接口的固定硬件实现。 OEM 请注意,不要预期OSPM将根据系统的不同提供不同的功能性固定硬件支持。功能性固定硬件的使用必然依赖于必须考虑的OS特定软件。 OEM 应咨询OS供应商,以确保特定操作系统支持特定的功能固定硬件接口。
- FFH是允许的,并且适用于完整和HW缩减的ACPI实现。
5.2.3.2. 通用地址结构
通用地址结构 (GAS) 为平台提供了描述寄存器位置的强大方法。该结构如下所述(通用地址结构 (GAS)),用于表示由 ACPI 定义的表内的寄存器地址。
| 表 5.1 通用地址结构 (GAS) 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 地址空间ID | 1 | 0 | 数据结构或寄存器所在的地址空间。定义的值为: 0x00 系统内存空间 0x01 系统 I/O 空间 0x02PCI 配置空间 0x03 嵌入式控制器 0x04 SMBus 0x05 SystemCMOS 0x06 PciBarTarget 0x07IPMI 0x08 General PurposeIO 0x09 GenericSerialBus 0x0A 平台通信通道(PCC) 0x0B 至 0x7E 保留 0x7F 功能固定硬件 0x80 至 0xBF 保留 0xC0 至 0xFF OEM 已定义 |
| 寄存器位宽 | 1 | 1 | 给定寄存器的大小(以位为单位)。当寻址数据结构时,该字段必须为零。 |
| 寄存器位偏移 | 1 | 2 | 给定地址处给定寄存器的位偏移量。当寻址数据结构时,该字段必须为零。 |
| 访问大小 | 1 | 3 | 指定访问大小。除非地址空间 ID 另有定义: 0 未定义(遗留原因) 1 字节访问 2 字访问 3 双字访问 4 QWord 访问 |
| 地址 | 8 | 4 | 给定地址空间(相对于处理器)中数据结构或寄存器的 64 位地址。 (具体格式见下文。) |
| 表 5.2 地址空间格式 地址空间 | 格式 | ||
| --- | --- | ||
| 0-系统内存 | 寄存器的64位物理内存地址(相对于处理器)。 32 位平台必须将高位DWORD 设置为 0。 | ||
| 1-系统 I/O | 寄存器的 64 位 I/O 地址(相对于处理器)。 32 位平台必须将高位DWORD 设置为 0。 | ||
| 2-PCI配置空间 | PCI 配置空间地址必须限制为 PCI 段组 0、总线 0 上的设备。存在此限制是为了在 PCI 总线枚举之前适应对固定硬件的访问。地址格式定义如下: 字位置 描述 保留的最高字(必须为 0) — PCI 总线 0 上的设备编号 — PCI 功能编号 配置空间标头中的最长字偏移量 例如:总线 0 段 0 上设备 7 上功能 2 的偏移量 23h 将表示为: 0x0000000700020023。 | ||
| 6-PCI BAR 目标 | PciBarTarget 用于在PCI设备BAR空间上定位MMIO寄存器。 PCI 配置空间地址必须仅限于主机总线上的设备,即 _BBN 对象返回的任何总线。存在此限制是为了适应在PCI总线枚举之前对固定硬件的访问。此类地址的地址字段格式为: 位 [63:56] – PCI 段位 [55:48] – PCI 总线位 [47:43] – PCI 设备位 [42:40] – PCI 功能位 [39:37] – BAR 索引# 位 [36:0] – 相对于 BAR 的偏移(以 DWORD 表示) | ||
| 0x0A-PCC | {需要定义} | ||
| 0x7F-功能固定硬件 | 除Address_Space_ID以外的GAS字段的使用由CPU制造商指定。功能性固定硬件的使用必然依赖于OS特定软件,必须予以考虑。 OEM 应咨询OS供应商,以确保特定操作系统支持特定的功能固定硬件接口。 |