持久内存系统包含如下关键组件:微处理器、连接微处理器内存总线上的持久内存模组(Persistent Memory Module,PMM)及持久内存上的非易失性存储介质,如图2-1所示。
图2-1 持久内存系统
使用持久内存来实现数据的持久化,需要重点关注如下三方面的内容。
利用非易失性存储介质在掉电后保存数据。数据在掉电后的保存通常通过非易失性存储介质来实现。新型的非易失性存储介质在第1章已进行了介绍,它们能够显著地提升持久内存的容量、密度与读写性能。
持久内存把数据保存到非易失性存储介质中,强调的是持久内存本身的特性,即当数据写入内存总线后,在持久内存内部即可保存。而对于数据保存的方法,微处理器内核及软件并不直接干涉,通常由平台实现者保证(硬件和固件)。
如今的计算机系统都假设一旦数据完成从内存控制器(Memory Controller,MC)向外部内存总线的传输操作,持久化过程即告完成,停止对持久内存的外部供电。然而,此时持久内存内部还需要电量将数据写入非易失性存储介质。因此持久内存需要储能器件提供电量,以保证在掉电后可以把缓冲区的数据写到磁性介质中。与SSD类似,持久内存的储能也是依靠电容来实现的。由于NVDIMM-N要完成数据从DRAM到NAND Flash介质的写入操作,所以需要外接一个和内存模组体积相当的超级电容;持久内存只需要写入最近时间写缓存区的数据,因此采用常规电解电容甚至贴片陶瓷电容就足够了。
由于系统掉电后持久内存模组的供电时间要长于它所在的计算机系统的供电时间,所以内存上还需要有供电隔离电路,以免内存上的电容反向向计算机系统进行供电。
微处理器在特定执行点保证数据的持久化。数据在微处理器内核和持久内存之间要经过一段很长的写入路径,为了保证数据的一致性和完整性,软件开发人员需要从代码层面明确控制数据到达写入路径的哪一环,以及何时可以认为持久化写入已经完成。
持久化域是保证数据持久化的子系统边界。当数据写入持久化域后,即使掉电,数据也不会丢失。持久化域和数据存取路径如图2-2所示。
图2-2 持久化域和数据存取路径
若要深入理解持久化域的概念,首先要了解计算机系统的内存架构和数据存取路径。计算机的缓存和内存系统包括以下层级:
● 一级高速缓存(L1)、二级高速缓存(L2),属于每个微处理器内核;
● 三级高速缓存(L3),为所有核心共享;
● 内存控制器及其内部的写队列;
● 持久内存。
当微处理器内核发起一条内存写命令时,数据是沿着层级逐渐下移的。首先,缓存控制器会检查该数据在缓存L1、L2、L3内有没有副本,如果没有就从内存进行读取,然后把新的数据写入缓存。从程序执行的角度来看,MOV指令的运行已经结束了,然而新的数据还停留在缓存里。当缓存空间不足时,其会向内存控制器发起请求,将该数据写入内存。内存控制器会先把数据写入内部的待写入队列(Write Pending Queue,WPQ),在一定条件下再把WPQ中的数据通过外部总线写入内存。
软件开发者通过执行微处理器指令可以控制数据落在存取路径的哪个层次,然而哪个层次的数据在系统掉电后能够保存是由硬件平台能力决定的。
持久化域就是硬件平台能力的抽象。当系统断电时,持久化域内的数据可以保证得到持久化保存,而持久化域外的数据则无法保证。
计算机的缓存和内存系统可能支持三类持久化域。
第一类持久化域是内存本身,数据持久性由持久内存本身及所需平台设计保障,对微处理器的依赖最低。软件通过调用CLFLUSH、CLFLUSHOPT、CLWB和PCOMMIT指令,可以清空缓存和WPQ,确保数据抵达持久内存。
第二类持久化域是内存子系统,通过异步内存刷新(Asynchronous DRAM Refresh,ADR)技术保证WPQ内的数据得到保存。软件只需要调用CLFLUSH、CLFLUSHOPT、CLWB指令,就可以清空缓存,确保数据抵达持久内存。由于ADR技术已经成为英特尔平台的必备功能,第二类持久化域目前得到了普遍使用。
第三类持久化域会扩展到缓存,通过增强异步内存刷新(Enhanced Asynchronous DRAM Refresh,eADR)技术保证缓存内的数据得到保存。软件无须调用任何指令,就能保证写入内存的数据得到保存。eADR技术只有在具备待定微处理器功能和平台软硬件设计的系统时才可以得到支持。
表2-1列出了数据写入的指令和技术。
ADR的作用是通知内存控制器把WPQ里的内容写入内存,并把内存置于自刷新模式。在自刷新模式下,内存会忽略总线上的数据,并且只要供电保持,内存上的数据就能通过定时刷新得以保存。
表2-1 数据写入的指令和技术
eADR除了清空WPQ,还会把在缓存中的数据也写入内存。
ADR技术是实现内存子系统持久化域的关键技术。
在微处理器核心进行写入操作时,任何一个时刻,在各级缓冲区或队列里都可能存在数据。为了保证持久内存内部数据的完整性,需要把持久化域内的数据写入持久内存,这需要通过ADR技术来实现。当系统发生意外断电时,ADR技术能保证WPQ内的数据被写入内存。
ADR技术的流程包含以下步骤:
①掉电预警。当系统掉电时,系统电源发出掉电预警信号。如果电源支持PMBus协议,SMBALERT信号将提供该预警。
②ADR触发。供电时序控制电路根据预警向芯片组发出ADR触发信号,同时系统的供电照旧。
③ADR通知。芯片组收到ADR触发信号后,启动ADR机制,启动ADR机制的消息通过内部总线送至微处理器。
④数据保存。微处理器内的内存控制器完成WPQ的清空和写入持久内存操作。
⑤ADR完成。芯片组会根据所需要的数据写入时间设定一个计时,计时完成,表示ADR已经完成,启动芯片组内部的复位时序,并向供电时序控制电路发出ADR完成信号。
⑥掉电控制。供电时序控制电路收到ADR完成信号后将启动系统下电时序,各供电单元的输出将被依次切断。
ADR技术的电路原理和基本流程如图2-3所示。
图2-3 ADR技术的电路原理和基本流程
请注意,ADR技术解决的是系统意外断电的场景。对于正常的关机、复位等操作,系统会由内部的硬件握手协议完成上述的步骤④,并不需要ADR的介入。
如果希望所保护的数据不局限于WPQ,而是扩展到缓存,则需要用到eADR技术。eADR技术的原理和流程与ADR技术相似,它们之间的区别如表2-2所示。
表2-2 ADR技术和eADR技术的区别
持久内存主要包含以下几个硬件模块:控制器、非易失性存储介质、动态内存和支持控制组件。不同类型的持久内存的内部结构有所不同,下面分别予以介绍。
先介绍英特尔傲腾持久内存,其关键组件如图2-4所示。
图2-4 英特尔傲腾持久内存的关键组件
持久内存与DRAM使用相同的硬件接口,但是使用不同的通信协议:DRAM使用DDR协议,持久内存使用类似于DDR协议。
(1)持久内存控制器:持久内存的大部分操作都需要通过持久内存控制器来实现,它管理着主机平台接口及DQ缓冲区的专用总线接口。持久内存控制器还提供完整的介质管理,包括磨损均衡、坏块管理、错误检测与修正、元数据管理和地址转换。持久内存控制器的特定寄存器可以通过主机端的SMBus链路寻址,与主机共享串行状态检测(Serial Presence Detect,SPD)数据。持久内存控制器通过专用的SMBus与电源管理集成控制器(Power Management Integrated Controller,PMIC)连接,以控制电源管理设备。最后,持久内存控制器还能通过专用的Flash端口与串行外设接口(Serial Peripheral Interface,SPI)Flash连接,用于存储一个或多个内存控制器的固件。
(2)非易失性存储介质:非易失性存储介质使用了英特尔专有的傲腾技术,每根持久内存包含多片介质芯片,第一代产品的容量有128GB、256GB、512GB三个选项可选。
(3)其他组件功能。
● DQ缓冲区:英特尔傲腾持久内存使用了行业标准的DDR4 LRDIMM DQ缓冲设备,其方式与DDR4 LRDIMM相似。这些DQ缓冲设备将缓冲并重新驱动所有主机接口的DQ和DQS信号,以降低持久内存向DRAM主机通道提供的有效DQ或DQS的电气短线长度,并与RDIMM、LRDIMM和新兴的NVDIMM实现互操作。DQ缓冲区由持久内存控制器通过专有的控制总线来管理。
● 参考时钟发生器:持久内存包含时钟发生器,其在主机电源出现故障时仍然能够正常工作。持久内存控制器始终使用本地参考时钟。
● SPD:持久内存上的SPD数据可由主机系统通过标准主机SMBus链路寻址,并允许主机平台获取内存类型、关键操作属性和通道训练指南等特定信息。持久内存上使用的SPD与标准DRAM上使用的SPD相同。SPD通过SMBus链路连接到持久内存控制器上。
● 电源管理集成控制器:持久内存支持多个独立的电压域,以提供所有设备所需的电源,并创建某些电压轨的隔离变体以便为开机、断电、电源故障和电源管理提供特定的时序要求。
除了英特尔傲腾持久内存,实现量产的另一大类持久内存就是NVDIMM-N,下面以AgigA的产品为参考介绍NVDIMM-N的硬件组成。
NVDIMM-N同时包含DRAM芯片和Flash芯片两种介质。正常工作时微处理器访问DRAM芯片,当系统掉电时则将数据由DRAM芯片复制到Flash芯片上,下一次上电时NVDIMM-N控制器再把Flash芯片中的数据恢复到DRAM芯片上。NVDIMM-N结构如图2-5所示。
图2-5 NVDIMM-N结构
NVDIMM-N的主要组成如下:
(1)NVDIMM控制器。NVDIMM控制器是NVDIMM-N的核心控制部件。当出现掉电预警时,它会控制多路选通开关以获得DRAM芯片访问权,并且把其中的数据复制到Flash芯片上。
掉电预警由系统其他控制逻辑检测并在发生掉电事件后发出,其形式可以是独立保存信号(SAVE)或SMBus的命令。理论上NVDIMM控制器能够检测自身电压并触发内容复制,但是由于没有和系统微处理器的“握手”,所以无法保证数据被成功写入持久化域。
NVDIMM控制器还需要控制内存模块上的供电。正常工作时NVDIMM-N由板载12V供电,进行数据复制时则切断和板载12V的通路,由超级电容进行供电。
(2)多路选通。多路选通(MUX)开关能选择DRAM芯片的访问源,其开关控制信号来自NVDIMM控制器。
(3)内存。内存使用的芯片和普通DRAM类似,但与一般服务器内存采用的×4位宽或×8位宽的内存芯片颗粒不同,它采用了×16位宽的芯片,以减少芯片数量和占用面积。
(4)Flash芯片。Flash芯片用于在掉电时保存数据,由NVDIMM控制器直接管理。
(5)超级电容。由于数据从DRAM芯片向Flash芯片的写入时间长达几十秒,普通的板载电容无法保持这么长的供电时间,所以NVDIMM-N采用外接的超级电容来供电。
目前市场上的持久内存都参照JEDEC标准下DDR的机械接口和电气接口与主机侧连接。已经发布的NVDIMM-N规范列出了一些新的接口要求,而NVDIMM-P规范还在讨论中,持久内存作为目前相关的商业化产品,可能是NVDIMM-P规范的重要参考。
持久内存和主机端有如下接口。
NVDIMM-N参用了标准的DDR协议,而英特尔傲腾持久内存采用的协议类似于DDR协议。
主机内存控制器与持久内存的通信协议使用与DDR相同的物理接口,但使用不同的协议,因此部分信号做了重定义。如果系统同时连接DRAM与持久内存,那么这两种协议可以在同一条总线上共存,主机侧的内存控制器会根据访问类型对信号进行适配。主机内存控制器支持两组协议并分别与DRAM或持久内存进行通信,若在其外部,则复用同一组引脚信号,如图2-6所示。
图2-6 DRAM和持久内存的总线
协议的读取和写入指令在总线上使用完整的高速缓存行地址发送,并由持久内存控制器将这些通用指令转换为特定的技术指令。
写入数据与写入指令同时发送,并由持久内存控制器进行缓冲。
执行读指令时需要进行拆分,在执行读取指令后,持久内存控制器会在数据可用时请求使用数据总线进行传输。数据总线方向和时序由总线控制,从主机发送到持久内存控制器的每个发送请求的命令数据包都允许异步命令或数据计时,因此持久内存控制器可以自由地将命令重新排序到内存,并重新记录读取返回数据。
DRAM规范的SMBus有两个功能:一是读写串行状态检测信息,内含详细的DIMM特征数据,包括关键时序、配置、容量、部件号、序列号和其他相关信息;二是温度检测。普通DRAM的这两个功能由一个集成芯片同时提供,持久内存的SMBus也需要支持上述功能,但相对于普通DRAM,其实现手段可能有所差异。
持久内存控制器连接在SMBus上,因此主机系统可以访问持久内存控制器上的多数通用寄存器,并执行许多关键后台功能,如将更新的固件加载到持久内存控制器中。图2-7为持久内存SMBus的连接图。
图2-7 持久内存SMBus的连接图
普通的DRAM只支持VDD(1.2V)、VTT(0.6V)、VPP(2.5V)三种输入电压,其中VDD能给DRAM颗粒提供较大的电流。持久内存内部需要提供多种电压供控制器、存储介质,如果所有供电由1.2V电压作为输入,则需要包含升压电路,从而使效率低下,所以NVDIMM-N规范定义了两个专用的12V输入电压来供电。持久内存采用同样的定义。
像持久内存这样比较复杂的系统,通常会采用集成电源芯片PMIC。PMIC可以提供多路输出电压,同时管理电源时序以及持久内存和主机侧电压之间的隔离。
保存信号(SAVE)是NVDIMM-N特有的,用于提示NVDIMM控制器开始向Flash里写入数据。主机端应该在完成ADR流程后再发出保存信号。
持久内存强制要求系统支持ADR,而且无须进行大规模的数据复制,只需要检测系统掉电时内部缓冲区的数据并将其写入持久化介质即可。