高级配置与电源管理接口规范(Advanced Configuration and Power Interface,ACPI)是英特尔、微软和东芝共同制定的一种电源管理标准,它可以帮助操作系统合理控制和分配计算机硬件设备的电量。有了ACPI,操作系统可以根据设备实际使用情况,按照需要关闭不同硬件设备。
持久内存的UEFI(Unified Extensible Firmware Interface,统一可扩展固件接口)驱动在开机自检过程中,根据持久内存初始化结果,创建符合ACPI规范的表格和代码,操作系统通过高级配置电源管理接口的表格和代码对持久内存进行配置和管理。
与持久内存相关的APCI接口如下所示。
(1)持久内存固件接口表。
持久内存固件接口表(NVDIMM Firmware Interface Table,NFIT)(见图2-8)描述了持久内存固件接口,主要包括以下结构:
● 系统物理地址范围表;
● 持久内存区域映射表;
● 交织集表;
● SMBIOS管理信息表;
● 持久内存控制区域表;
● 持久内存块数据区域表;
● 可清洗缓存地址表。
系统物理地址范围表为操作系统提供了每段物理地址空间中的内存属性,包括内存类型(如DRAM、持久内存等)、缓存类型(如可缓存、不可缓存),以及和不同微处理器内存控制器的邻近关系(proximity domain参考异构资源亲和表)。
交织集表提供了持久内存的地址编码信息。
持久内存控制区域表为操作系统提供了持久内存设备的生产厂商、设备ID、版本信息、制造地点、制造日期、唯一的序列号等。
图2-8 持久内存固件接口表
持久内存区域映射表包含了持久内存设备在SMBIOS管理信息表中的内存设备类型表的索引号、系统物理地址范围表的索引号、持久内存控制区域表的索引号、交织集表的索引号,操作系统可以通过这些索引号获取相应持久内存设备的所有硬件信息。
(2)异构内存属性表。
异构内存属性表(Heterogeneous Memory Attribute Table,HMAT)(见图2-9)提供了不同地址空间的内存属性,如内存侧的缓存属性、内存带宽及延时。操作系统可以通过异构内存属性表获取相应地址空间的内存性能属性,从而决定如何使用持久内存。
图2-9 持久内存异构内存属性表
异构内存属性表主要包含以下结构:
● 内存子系统地址范围表;
● 系统局部延时和带宽信息表;
● 内存缓存信息表。
操作系统如果没有异构内存属性表,也可以通过系统资源亲和表和系统位置距离信息表来获取系统中不同持久内存区间的性能特性。
(3)系统资源亲和表。
系统资源亲和表(System Resource Affinity Table,SRAT)包含如下两个部分:
● 微处理器亲和表,用于描述每一个微处理器线程属于哪个邻近域;
● 内存亲和表,用于描述每一个内存空间属于哪个邻近域。
(4)系统位置距离信息表。
系统位置距离信息表(System Locality Distance Information Table,SLIT)量化了每个邻近域和其他邻近域之间的距离(访问延时)。
不同版本的设备特定方法(Device Specific Method,DSM)规范支持的持久内存设备命令不尽相同,操作系统可以通过DSM规范的第一条命令查询系统支持的持久内存命令。
第一版持久内存的DSM命令列表如表2-3所示。
表2-3 第一版持久内存的DSM命令列表
续表
第二版持久内存的DSM规范在第一版的基础上加入了一些命令,如表2-4所示。
表2-4 第二版持久内存的DSM命令列表
统一可扩展固件接口规范(Unified Extensible Firmware Interface,UEFI)规范用来定义操作系统与系统固件之间的软件界面,负责带电自检、联系操作系统、提供联系操作系统与硬件的接口。持久内存的硬件初始化代码、底层配置工具都是符合UEFI规范的驱动。
系统管理BIOS(System Management BIOS,SMBIOS)规范是主板或系统制造商以标准格式显示产品管理信息需遵循的统一规范。持久内存的UEFI驱动在POST(开机自检)过程中获取持久内存的基本信息,创建符合SMBIOS规范的硬件管理信息操作系统。
持久内存固件的功能主要包括以下几点。
(1)持久内存固件初始化。
持久内存固件初始化主要包含两个阶段。第一阶段引导ROM负责验证及载入持久内存固件。第二阶段功能固件负责初始化介质接口及初始化介质读写策略(包括介质磨损均衡、紧急掉电处理策略、散热处理策略等):
● 建立地址映射;
● 分割介质区域;
● 初始化错误处理程序;
● 初始化RAS处理程序。
(2)介质编码和读写。
(3)地址翻译。
(4)介质管理和磨损均衡。
(5)状态汇报和管理。
主机端固件UEFI模块框架图如图2-10所示。
图2-10 主机端固件UEFI模块框架图
持久内存的内存时序训练的基本步骤与DRAM类似,本节主要介绍和DRAM不一致的地方。
UEFI的内存初始化代码,首先会从UEFI配置中获取持久内存初始化的一系列配置,然后通过SMBus获取每根持久内存的SPD数据(SPD数据的获取方法及格式完全符合JEDEC标准化组织的定义),接下来UEFI内存初始化代码根据SPD数据中的内存类型判断是否为持久内存,然后根据从SPD数据中获取的参数进行持久内存的时序训练。
在内存时序训练结束后,UEFI会根据持久内存模式将发现的新内存呈现在微处理器的地址空间中。如果持久内存配置成内存模式,那么微处理器地址空间中只会有持久内存,而DRAM将会成为持久内存的缓存,不存在于微处理器的地址空间中。如果是AD模式,那么微处理器地址空间中将出现易失性内存及持久内存,一般排列顺序是:易失性内存、持久内存。
UEFI将根据内存训练后发现的内存信息生成一个表格传递给后续的UEFI驱动,后续的UEFI驱动根据内存信息表继续创建SMBIOS表,生成APCI表格等以供操作系统使用。BIOS支持两种操作系统的启动,一种是UEFI OS,另一种是Legacy OS。对于两种不同的操作系统,UEFI驱动或者CSM模块都会根据之前提到的内存信息表创建内存信息以供操作系统使用,Legacy OS使用的是E820表格,UEFI OS使用的是内存映射表。在UEFI内存映射表中,持久内存的地址区间将被标记成EfiPersistentMemory类型。
UEFI内存映射表的内存类型枚举:
针对AD模式,UEFI会把持久内存和DRAM在微处理器内存空间统一编址,设定持久内存区域的命名空间,这样UEFI或操作系统就可以通过命名空间找到以交织集为边界的持久内存区域。
针对内存模式,UEFI只会把持久内存会编址到微处理器内存空间,而不会编址易失性内存。
无论内存模式还是AD模式,BIOS都需要配置持久内存的交织集。交织集是指在地址编码的时候,在内存空间交替叠加不同内存通道的物理介质,这样系统就可以同时访问不同通道的持久内存,充分利用持久内存的带宽。UEFI持久内存驱动会验证当前的硬件是否兼容用户的配置,然后对持久内存进行配置操作。