持久内存系统包含如下关键组件:微处理器、连接微处理器内存总线上的持久内存模组(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技术的区别