5.7. 预定义对象
ACPI兼容操作系统的AML解释器支持对许多预定义对象的评估。这些对象被视为“内置”于目标操作系统上的AML解释器中。
下表显示了预定义对象名称的列表。
| 表 5.174 预定义对象名称 名称 | 描述 |
|---|---|
| \_GL | 全局锁互斥锁 |
| \_OS | 操作系统名称 |
| \_OSI | 操作系统接口支持 |
| \_REV | 已实施的ACPI规范的修订 |
5.7.1. \_GL (Global Lock Mutex)
这个预定义对象是一个互斥对象,其行为类似于第 19.6.87 节“互斥体(声明同步/互斥对象)”中定义的互斥体,并添加了获取此互斥体还获取第 5.2.10.1 节“全局锁”中定义的共享环境全局锁的行为。这允许控制方法在必要时显式地与全局锁同步。
5.7.2. \_OSI (Operating System Interfaces)
系统固件使用此方法来查询OSPM有关主机操作系统支持的接口和功能。该方法的使用和实现模型如下:
_OSI 方法是在操作系统内实现的。
OSI 由固件AML 代码调用,通常在初始化期间(例如通过_INI 方法)。因此,_OSI 实际上是从固件AML到OS的“上行调用”——与其他控制方法完全相反。
固件调用 _OSI 是对操作系统的请求:“您支持此接口/功能吗?”
主机用简单的是或否响应此 _OSI 请求(个/零、TRUE/FALSE、支持/不支持)。
_OSI 方法需要一个参数并返回一个整数。该参数是一个字符串,其中包含可选的ACPI定义的 OsVendorString,后跟必需的 FeatureGroupString。功能组字符串可以是ACPI定义的或OS供应商定义的。
_OSI 不能也不应该被固件用来尝试识别主机操作系统;相反,此方法旨在用于识别OS支持的特定功能和接口。下面的例子说明了这一点:
\_OSI ("Windows 2009")
在上面的 _OSI 调用中,“Windows”是 OsVendorString,“2009”是供应商定义的 FeatureGroupString。此调用的返回值TRUE(个位)NOT表明执行的操作系统是 Windows。它只是表明实际的OS符合“Windows 2009”功能和界面,因此与 Windows 2009 兼容。除 Windows 之外的ACPI实现通常对所有 Windows _OSI 请求回复TRUE。
OsVendorString 应始终伴随FeatureGroupString。但是,OsVendorString 本身是可选的,如果功能组字符串适用于所有操作系统,则可以省略。 ACPI定义的功能组字符串可以以这种独立的方式使用。对于特征组,字符串可以以这种独立的方式使用。例如:
\_OSI ("3.0 Thermal Model")
参数:(1)
Arg0 – 一个字符串,包含可选的OS供应商前缀(如表 5-186 中定义)和/或所需的功能组字符串(如表 5-187 中定义的ACPI,或供应商定义的自定义功能/接口字符串)。对于ACPI定义的功能组字符串,不需要可选的OS供应商字符串。
返回值:
包含布尔值的整数,指示是否支持所请求的功能:
0x0 (零) – 不支持接口、行为或功能
个 (-1) – 支持接口、行为或功能。注:在 32 位模式(DSDT 版本 1)中,Ones 的值为 0xFFFFFFFF;在 64 位模式(DSDT 版本 2 及更高版本)中,Ones 的值为 0xFFFFFFFFFFFFFFFF。
| 表 5.175 预定义操作系统供应商字符串前缀 操作系统供应商字符串前缀 | 描述 |
|---|---|
“FreeBSD”<FeatureGroupString> | 免费 BSD OS 功能/界面 |
“HP-UX” <FeatureGroupString> | HP Unix 操作环境 OS 功能/界面 |
“Linux”<FeatureGroupString> | GNU/Linux 操作系统 OS 功能/界面 |
“OpenVMS”<FeatureGroupString> | HP OpenVMS 操作环境 OS 功能/界面 |
“Windows”<FeatureGroupString> | Microsoft WindowsOS 功能/界面 |
| 表 5.176 标准ACPI定义的功能组字符串 功能组字符串 | 描述 |
| --- | --- |
| “模块设备” | OSPM支持命名空间中模块设备(ACPI0004)的声明,并将枚举模块设备范围下的对象。 |
| “处理器设备” | OSPM支持使用ACPI0007处理器设备HID在命名空间中声明处理器。 |
| “3.0热模型” | OSPM 支持修订版 3.0 中的 ACPI 热模型扩展。 |
| “扩展地址空间描述符” | OSPM支持扩展地址空间描述符 |
| “3.0 _SCP 扩展” | OSPM 使用 ACPI 3.0 中定义的附加声学限制和功率限制参数评估 _SCP。 |
| “处理器聚合器设备” | OSPM支持使用ACPI000C处理器聚合器设备HID在命名空间中声明处理器聚合器设备。 |
如果操作系统支持行为,OSPM可能表示支持多个OS接口/行为字符串。例如,操作系统的较新版本可能指示支持来自该操作系统的全部或一些先前版本的字符串。
_OSI 为平台提供了支持新操作系统版本及其相关功能(当新版本可用时)的能力。 OSPM 可以选择基于_OSI 参数字符串公开新功能。也就是说,OSPM可以使用传递到 _OSI 的字符串,通过维护平台的已知兼容行为来确保旧平台和新操作系统之间的兼容性。因此,建议通过_SB.INI控制方法评估_OSI,以便在操作系统初始化的早期提供平台兼容的行为或功能。
由于功能组功能可能依赖于OSPM实现,因此可能需要在功能组字符串之前检查OS供应商定义的字符串。
平台开发人员应查阅OS供应商特定信息,以了解OS供应商定义的表示一组OS接口和行为的字符串。下表列出了代表操作系统的ACPI定义的字符串和ACPI功能组。
5.7.2.1. _OSI 示例
使用标准ACPI定义的功能组字符串 ::
Scope (_SB)
{
Name (PAD1, 0)
Name (MDEV, 0)
Method (_INI)
{
If (CondRefOf (\_OSI) // Ensure \_OSI exists in the OS
{
If (\_OSI ("Processor Aggregator Device")
{
Store (1, PAD1)
}
If (\_OSI ("Module Device")
{
// Expose PCI Root Bridge under Module Device –
// OS support Module Device
Store (0, MDEV1)
Loadtable ("OEM1", "OEMID", "Table1")
}
Else
{
// Expose PCI Root Bridge under \\_SB –
// OS does not support Module Device
Store (1, MDEV1)
Loadtable ("OEM2", "OEMID", "Table2")
}
}
}
}
使用OS供应商定义的功能组字符串:
//
// In this example, "Windows" is the OsVendorString, and the year strings
// (2009, 2012, and 2105) are the vendor-defined FeatureGroupStrings
//
Scope (_SB)
{
Name (OSYS, 0x7D0) // Type of OS indicating supported features
Method (_INI)
{
If (CondRefOf (\_OSI) // Ensure \_OSI exists in the OS
{
If (\_OSI ("Windows 2009")
{
Store (0x7D1, OSYS)
}
If (\_OSI ("Windows 2012")
{
Store (0x7D1, OSYS)
}
If (\_OSI ("Windows 2015")
{
Store (0x7D1, OSYS)
}
}
}
}
5.7.3. \_OS(OS名称对象)
该预定义对象的计算结果为标识操作系统的字符串。在稳健的OSPM实施中,_OS对每个OS版本的评估不同。这可以允许AML代码适应OSPM实现中的差异。该值不会随着AML解释器的不同版本而改变。
参数:
无
返回值:
包含操作系统名称的 String。
5.7.4. \_REV(修订数据对象)
该预定义对象的计算结果为一个整数 (DWORD),表示由指定的“_OS¤”实现的“ACPI¤ 规范”的修订版。
参数:
无
返回值:
一个整数,表示当前执行的ACPI实施的修订版本。
仅支持ACPI 1,仅支持32位整数。
支持ACPI 2 或更大。支持 32 位和 64 位整数。
实际整数宽度取决于 DSDT 的修订版(修订版 < 2 表示 32 位,>= 2 表示 64 位)。
其他值 - 保留
5.7.5. \_DLM(DeviceLock 互斥体)
当AML对设备的访问必须与OS环境同步时,该对象出现在设备范围中。它与标准互斥对象结合使用。通过_DLM,标准互斥体照常在AML环境中提供同步,而且还与OS环境同步。
_DLM 评估为一个包的包,每个包包含对互斥锁的引用和受互斥锁保护的可选资源模板。如果仅指定互斥锁名称,则共享规则(即哪些资源受锁保护)由AML和OS设备驱动程序之间的预定义契约定义。如果指定了资源模板,则仅保护资源模板内的那些资源。
参数:
无
返回值:
一个可变长度的包,包含互斥体参考和资源模板的子包。每个子包中的资源模板是可选的。
返回值信息:
Package {
DeviceLockInfo [0] // **Package**
. . .
DeviceLockInfo [n] **// Package**
}
每个可变长度的 DeviceLockInfo 子包包含一个元素或 2 个元素,如下所述:
Package {
DeviceLockMutex // **Reference** to a Mutex object
Resources // **Buffer** or **Reference** (Resource Template)
}
| 表 5.177 DeviceLockInfo 包值 元素 | 对象类型 | 描述 |
|---|---|---|
| DeviceLockMutex | 参考 | 对AML代码和主机操作系统之间共享的互斥锁的引用。 |
| 资源 | Buffer*(或对缓冲区的引用) | 选修的。包含一个资源模板,该模板描述了要受设备锁定互斥体保护的资源。 |
示例:
Device (DEV1)
{
Mutex (MTX1, 0)
Name (RES1, ResourceTemplate ()
{
I2cSerialBusV2 (0x0400, DeviceInitiated, 0x00001000,
AddressingMode10Bit, "\\_SB.DEV1",
0, ResourceConsumer, I2C1)
})
Name (_DLM, Package (1)
{
Package (2)
{
MTX1,
RES1
}
})
}
Device (DEV2)
{
Mutex (MTX2, 0)
Mutex (MTX3, 0)
Name (_DLM, Package (2)
{
Package (2)
{
\\DEV2.MTX2,
ResourceTemplate ()
{
I2cSerialBusV2 (0x0400, DeviceInitiated, 0x00001000,
AddressingMode10Bit, "\\_SB.DEV2",
0, ResourceConsumer, I2C2)
}
},
Package (1) // Optional resource not needed
{
\\DEV2.MTX3
}
})
}