9.13. 内存设备
内存设备允许平台向 OSPM 传达内存的动态属性,并且当平台支持在系统处于活动状态时添加或移除内存,或者当平台支持内存带宽监视和报告时(见第 9.13.2 节),则必须提供内存设备。内存设备描述的物理内存可能与系统地址映射接口描述的物理内存完全相同(见第 15 节)。它们不描述该内存是如何被使用或曾经如何被使用的。如果一段物理内存在系统地址映射接口中被标记为 AddressRangeReserved 或 AddressRangeNVS,并且它也在某个内存设备中被描述,那么 OS 有责任保证该内存设备永远不会被禁用。
如果系统中有一部分内存在本质上是静态的,则没有必要用内存设备来描述系统中的所有内存。例如,如果用于系统 RAM 前 16 MB 的内存不能被弹出、插入或禁用,则该内存可以仅由系统地址映射接口表示。但是,如果内存可以被弹出、插入或禁用,或者平台支持内存带宽监视和报告,则该内存必须由内存设备表示。
9.13.1. 地址解码
内存设备必须提供一个 _CRS 对象,用于描述该内存所解码的物理地址空间。如果该内存能够解码物理地址空间中的备选范围,则这些设备还可以提供 _PRS、_SRS 和 _DIS 对象。如果该设备可以被弹出,则其他设备对象也可能适用。
9.13.2. 内存带宽监视和报告
在平台运行期间,平台外部可能会出现一种不利条件,其补救措施需要降低平台可用的内存带宽。例如,服务器管理控制器检测到不利的热条件,或者为了保持在可接受的限制内而需要降低数据中心中平台的总功耗。向 OSPM 提供关于平台导致的内存带宽降低的信息,使 OSPM 能够对该情况进行更稳健的处理。以下各节描述了 OSPM 用于配置基于平台的内存带宽监视以及在平台执行内存带宽节流时确定可用内存带宽的对象。
9.13.2.1. _MBM(内存带宽监视数据)
可选的 _MBM 对象为内存设备提供内存带宽监视信息。
参数:
无
返回值:
一个 Package,包含如下文 MBM 包详细信息中所述的内存设备状态信息。
返回值信息:
对 _MBM 求值将返回一个具有以下格式的包:
Package (){
Revision, // Integer
WindowSize, // Integer DWORD
SamplingInterval, // Integer DWORD
MaximumBandwidth, // Integer DWORD
AverageBandwidth, // Integer DWORD
LowBandwidth, // Integer DWORD
LowNotficationThreshold, // Integer DWORD
HighNotificationThreshold // Integer DWORD
}
表 9.8 MBM 包详细信息
| 字段 | 格式 | 描述 |
|---|---|---|
| Revision | Integer | 当前修订版本为:0 |
| Window Size | Integer (DWORD) | 此字段指示平台用于报告平均带宽的平均窗口大小(以秒为单位)。 |
| Sampling Interval | Integer (DWORD) | 此字段指示平台在平均窗口期间用于记录带宽的采样间隔(以秒为单位)。 |
| Maximum Bandwidth | Integer (DWORD) | 此字段指示由该内存设备描述的内存的最大内存带宽(以每秒兆字节为单位)。 |
| Average Bandwidth | Integer (DWORD) | 此字段指示该平均窗口的移动平均内存带宽(以百分比表示)。 |
| Low Bandwidth | Integer (DWORD) | 此字段指示为该平均窗口记录的最低内存带宽(以百分比表示)。 |
| Low Notification Threshold | Integer (DWORD) | 当移动平均内存带宽值(以百分比表示)低于此字段指示的值时,平台在该内存设备上发出 Notify (0x80)。 |
| High Notification Threshold | Integer (DWORD) | 当移动平均内存带宽值(以百分比表示)增加到或超过此字段指示的值时,平台在该内存设备上发出 Notify (0x81)。 |
9.13.2.2. _MSM(内存设置监视)
此可选对象用于设置上文第 9.13.2.1 节中描述的内存带宽监视参数。
参数(4)
Arg0 - WindowSize (Integer(DWORD)):指示窗口大小(秒)。
Arg1 - SamplingInterval (Integer(DWORD)):指示采样间隔(秒)。
Arg2 - LowNotificationThreshold (Integer(DWORD)):指示低通知阈值(百分比)。必须 <= HighNotificationThreshold。
Arg3 - HighNotificationThreshold (Integer(DWORD)):指示高通知阈值(百分比)。必须 >= LowNotificationThreshold。
返回值
一个 Integer (DWORD),包含按位编码的结果代码,如下所示:
0x00000000 - 成功设置所有内存带宽监视参数。
非零 - 至少有一个内存带宽监视参数值无法按如下方式设置:
表 9.9 MSM 结果编码
| 位 | 定义 |
|---|---|
| 0 | 若清零则表示 WindowSize 设置成功。若置位,则表示 WindowSize 参数无效。 |
| 1 | 若清零则表示 SamplingInterval 设置成功。若置位,则表示 SamplingInterval 参数无效。 |
| 2 | 若清零则表示 LowNotificationThreshold 设置成功。若置位,则表示 LowNotificationThreshold 参数无效。 |
| 3 | 若清零则表示 HighNotificationThreshold 设置成功。若置位,则表示 HighNotificationThreshold 参数无效。 |
| 31:4 | 保留(必须为 0) |
9.13.3. 用于内存设备的 _OSC 定义
OSPM 在内存设备下对 _OSC 求值,以向平台传达 OSPM 的能力。参数定义如下
参数(4)
Arg0 - UUID (Buffer): 03B19910-F473-11DD-87AF-0800200C9A66
Arg1 - Revision ID (Integer): 1
Arg2 - Arg3 中条目的数量 (Integer): 2
Arg3 - DWORD 能力 (Buffer):
第一个 DWORD:见第 6.2.10 节
第二个 DWORD:见第 6.4.3.5.2 节。
返回值
一个 Buffer,包含平台能力
表 9.10 内存设备 _OSC 能力 DWORD 编号 2
| 位 | 字段名称 | 定义 |
|---|---|---|
| 0 | 内存带宽变更通知 | 如果 OSPM 支持处理内存带宽变更通知,则设置此位。如果平台支持在内存带宽发生变化时发出通知的能力,则只有在对此位被设置的情况下对 _OSC 求值之后才可以这样做。如果在此位清除的状态下对 _OSC 求值,则如果先前已启用,平台将停止发出通知。 |
| 31:1 | 保留(必须为 0) |
返回值信息
能力缓冲区(缓冲区)- 平台通过返回一个长度相同的 DWORD 缓冲区来确认能力缓冲区。置位的位表示已确认,清零的位表示平台不支持该能力。
9.13.4. 示例:内存设备
Scope (\_SB){
Device (MEM0) {
Name (_HID, EISAID ("PNP0C80"))
Name (_CRS, ResourceTemplate () {
QWordMemory
ResourceConsumer,
,
MinFixed,
MaxFixed,
Cacheable,
ReadWrite,
0xFFFFFFF,
0x10000000,
0x30000000,
0,
,,)
}
}
}