1 内存数据持久化
1.1 数据持久化
持久内存系统包含如下关键组件:微处理器、连接微处理器内存总线上的持久内存模组(Persistent MemoryModule,PMM)及持久内存上的非易失性存储介质。
使用持久内存来实现数据的持久化,需要重点关注如下三方面的内容。
1.材料特性
数据在掉电后的保存通常通过非易失性存储介质来实现。材料特效见专栏非易失存储特性一文。
2.持久内存特性
如今的计算机系统都假设一旦数据完成从内存控制器(Memory Controller,MC)向外部内存总线的传输操作,持久化过程即告完成,停止对持久内存的外部供电。然而,此时持久内存内部还需要电量将数据写入非易失性存储介质。因此持久内存需要储能器件提供电量,以保证在掉电后可以把缓冲区的数据写到磁性介质中。
与SSD类似,持久内存的储能也是依靠电容来实现的。由于系统掉电后持久内存模组的供电时间要长于它所在的计算机系统的供电时间,所以内存上还需要有供电隔离电路,以免内存上的电容反向向计算机系统进行供电。
3.数据完整性
微处理器在特定执行点保证数据的持久化。数据在微处理器内核和持久内存之间要经过一段很长的写入路径,为了保证数据的一致性和完整性,软件开发人员需要从代码层面明确控制数据到达写入路径的哪一环,以及何时可以认为持久化写入已经完成。持久化域就是硬件平台能力的抽象。当系统断电时,持久化域内的数据可以保证得到持久化保存,而持久化域外的数据则无法保证。
计算机的缓存和内存系统可能支持三类持久化域。
第一类持久化域是内存本身,数据持久性由持久内存本身及所需平台设计保障,对微处理器的依赖最低。
第二类持久化域是内存子系统,通过异步内存刷新(Asynchronous DRAM Refresh,ADR)技术保证WPQ内的数据得到保存。
第三类持久化域会扩展到缓存,通过增强异步内存刷新(Enhanced Asynchronous DRAM Refresh,eADR)技术保证缓存内的数据得到保存。
2 持久内存的安全考虑
持久内存的安全功能跨越多个层级,包括保护持久内存介质中存取的数据,以及保护持久内存的配置数据和控制机制。持久内存的安全模型采用了SSD和NVMe技术使用的ATA(Advanced Technology Attachment,高级技术附件)安全模型,写入持久内存介质中的数据由每根持久内存控制器使用XTS-AES-256协议加密。
内存模式中的密钥在每次断电重启后都会重新生成,因此先前的数据不再可用,称为易失性,DRAM具有相同的特性。
在AD模式下运行时,可以通过设置用户密码来解锁持久内存区域,并启用对命名空间内数据的访问来保证安全性。持久内存支持主密码,主密码用来启动安全擦除功能,但是主密码仅可以用于本地介质擦除,如果主密码丢失,那么将无法解锁持久内存并且无法再次使用。如果用户密码丢失,则可以使用主密码来启用安全擦除功能,以重置持久内存。持久内存支持从操作系统或UEFI下访问的安全擦除功能,该功能可以强制重新生成密钥,使持久化区域中的数据无法访问。
2.1 威胁模型
威胁模型假定攻击者获得了包含持久内存的服务器的物理拥有权,该服务器包含敏感的或有价值的数据(或以前使用的独立持久内存),并试图非法恢复持久内存上的数据。在此威胁模型下,假定攻击者可以物理访问正在使用的服务器平台(内存模式区域或未锁定的AD模式区域),并且能够获取持久内存上的数据访问权限
持久内存的攻击场景包括:
- 从办公室或数据中心盗取包含持久内存的服务器;
- 持久内存被有平台访问权限的攻击者移除;
- 从持久内存上物理复制数据;
- 将攻击数据粘贴到持久内存中;
- 窥探内存总线上的数据;
- 修改持久内存固件。
云计算的出现对多租户虚拟化环境中的租户隔离和静态数据提出了更高的要求,运行时用户隔离受虚拟化基础架构虚拟机监视器的控制,企业级的存储设备应支持将存储介质划分为“个体租户”的逻辑分区(每个分区有独立的密钥管理),这种方法的好处是租户的数据可以独立锁定和擦除。多租户威胁模型假设租户数据可能因为隔离机制的漏洞受到其他租户的影响,因此能够安全地擦除租户数据是最小化暴露数据的有效方式。
2.2 安全目标
持久内存的安全分为三类:静态数据安全、访问控制和介质管理保护。
1.静态数据安全
(1)机密性保护。
持久内存可以为存储在设备上的所有用户数据提供机密性保护,从而防止持久内存落入不法分子手中,包括防止冷启动攻击,这意味着要对介质中的易失性和持久化区域进行加密。AES-XTS-256是用于保护持久内存介质的算法,它同样适用于块模式数据的加密。
(2)持久内存数据的静态保护。
静态保护持久内存数据需要用到加密持久内存的加密密钥,以加密锁定的方式永久存储用户数据,它要求安全管理员可以随时以加密方式擦除持久化域。安全擦除是一种安全管理员快速使设备上的数据无法恢复的方法。
锁定:持久性内存区域可在特定系统电源事件(关机、重新启动)期间“加密”锁定,持久内存安全架构要求该区域处于锁定状态,以提供静态数据保护。解锁持久内存应使用用户密码进行外部身份验证。
安全擦除:利用持久内存的安全擦除功能,能使设备上的数据无法恢复,以实现设备的安全退役或者设备的安全重置。安全擦除的作用域是全局的持久内存,而不是特定的持久内存或者块模式区域,只有安全管理员可以调用安全擦除命令。在安全擦除之后,持久化数据可能仍然存在于微处理器的高速缓存中,为避免数据被损坏或被窃取,必须使用特定指令使微处理器的高速缓存无效。
(3)易失性内存数据的保护。
为了模拟易失性内存的行为,持久内存介质上易失性区域被加密,然后在某些系统状态转换时以加密方式擦除。在内存模式下,DRAM缓存是未加密的,此时易失性内存加密区域在重置事件、睡眠、断电重启、电源故障(ADR命令和电压检测)事件中将无法恢复。
2.访问控制
持久内存为两种模式定义了不同的访问控制目标:AD模式访问控制和内存模式访问控制。
(1)AD模式访问控制。
持久内存提供了一种机制,以页面级粒度(由持久内存文件系统管理)强制应用程序访问持久内存区域。持久内存文件系统(Persistent Memory File System,PMFS)每个区域的粒度提供具有R/W/D/E权限类型的POSIX访问控制结构。作为开放区域的一部分,PMFS为请求的应用程序设置内存管理单元(Memory Management Unit,MMU)映射,持久内存访问控制用于Linux和Windows的主机虚拟文件系统(Virtual File System,VFS),以实现本机内核文件访问控制的功能。
(2)内存模式访问控制。
内存模式的访问控制与AD模式的工作方式类似,操作系统管理内存分配,并设置相应的页表权限,同时使用微处理器的内存管理单元强制执行页面级保护。
3.介质管理保护
持久内存介质管理算法通过反复均匀地写入位置来防止持久内存过早的磨损。持久内存支持为介质管理提供保护,以防过早地磨损介质和其他介质管理相关的PDOS攻击。
2.3 基于硬件的内存加密
持久内存使用AEP-XTS-256加密算法进行静态数据保护。
在内存模式下,每次断电重启后,DRAM缓存会丢失数据,持久内存加密密钥也会丢失,并在每次启动时重新生成。
在AD模式下,使用模块上的密钥加密持久化介质,持久内存在掉电时会将数据锁定,需要利用用户密钥解锁。
以下是持久内存为了保障数据和密码安全所采用的手段。
- 加密密钥存储在模块上的元数据区域中,且只能被持久内存控制器访问,打开密钥需要输入密码;
- 安全加密擦除和重写可以实现持久内存安全的再利用或丢弃;
- 固件身份验证和完整性:支持使用固件的签名版本,并提供修订控制选项。
3 持久内存的可靠性、可用性和可维护性
3.1 可靠性、可用性和可维护性定义
3.2 硬件基础
1.缓存行与纠错码
纠错码(Error Correcting Code,ECC)用来保护持久内存的数据正确性,涉及两个缓存行,这也意味着读操作会读出两个缓存行的数据。而对于写操作,持久内存控制器会尽量同时处理两个缓存行来优化性能。但是对于写一个缓存行,持久内存会通过读—修改—写来完成操作(ECC重新计算)。
2.介质的组织
持久内存的介质被组织成ECC块,每个ECC块包括4个微处理器缓存行(每个64字节)、4个毒药标志位(对应4个缓存行,存储在元数据中)、其他元数据(每个缓存行的状态)和ECC。
3.空闲块管理
持久内存会预留出一定的空闲块作为备份,空闲块由持久内存的固件来实现。如果持久内存检测到坏块,那么它会放弃坏块,选择新的空闲块。不能修复的数据会从坏块写到空闲块中,正确的ECC值和毒药标志位也会被写入空闲块。毒药标志位表明新的缓存行已经没有正确的数据了,软件如果读取新的缓存行,那么返回的数据将包括毒药标志。
4.数据毒药
数据毒药是一种错误抑制的方式,它提供了一个有可能恢复介质里不可纠正数据的机制。当发生不可纠正错误(Uncorrectable Error,UCE)时,持久内存控制器会用毒药标记错误数据,并将数据和毒药传给微处理器。
DRAM的毒药机制可以在系统启动时选择启用或者禁止,持久内存的毒药是必需的。对微处理器来说,如果毒药启用了,流程和标准的DRAM毒药一样;如果毒药没有启用,那么系统将产生严重的硬件错误异常。
毒药的一个影响是它延时不可纠正数据的“判断”。在传统的系统硬件错误架构中,当毒药机制被禁止时,不可纠正的数据是致命的错误,它会使系统立刻崩溃。但当毒药机制被启动时,不可纠正的数据则不是立刻致命的,取而代之的是数据被标记成毒药。因此当不可纠正的数据被读取时,进行读数据操作的用户可以决定如何处理被标记成毒药的数据。例如,计算机显卡完全可以忽略被标记成毒药的数据,继续工作,因为一个像素导致屏幕有一个觉察不到的闪光点是完全可以容忍的。如果是微处理器的某个进程或线程来读取数据,硬件会判断这个错误是不是可以恢复,如果硬件认为这个错误是可以恢复的,那么它会用特殊的记号来标记这个错误,这样操作系统或者虚拟机管理进程可以决定是否恢复错误或者怎么恢复错误。
毒药标志位被保存在持久内存介质的元数据里。在内存模式下,系统重启会清除毒药标记;在AD模式下,系统重启不会清除毒药标志位。值得注意的是:如果数据错误的类型是致命的,那么微处理器的上下文内容将被破坏且不能被信任,所以微处理器应该立刻重启系统以恢复到正常状态。
5.清除数据毒药
数据块上的毒药可以通过MB命令来清除。
3.3 错误检测和恢复
错误检测和恢复是持久内存控制器用来防止持久内存介质的随机比特位错误,目的是维护所传输数据的完整性。如果错误是可以纠正的,持久内存控制器就会纠正数据,这样就可以防止可纠正的错误(Correctable Error,CE)因错误比特位的积累变成不可纠正的错误。下面是三种错误的处理方式。
(1)读操作(可纠正错误)。
当读数据的时候,通过ECC对数据进行校验和纠正。如果从硬件上来说数据不能被纠正,持久内存控制器就会用毒药标记错误,并且传给主机内存控制器,之后系统或者BIOS可以通过软件进行恢复(重试、丢弃或者忽略)。
(2)读操作(不可纠正错误)。
当读数据的时候,通过ECC对数据进行校验和纠正。如果从硬件上来说数据不能被纠正,持久内存控制器就会用毒药标记错误,并且传给主机内存控制器,之后系统或者BIOS可以通过软件进行恢复(重试、丢弃或者忽略)。
(3)写操作(毒药区域)。
在写入新数据的时候,数据会被正常写到持久内存介质的毒药区域,同时毒药会被清除。
3.4 单芯片数据纠正和双芯片数据纠正
1.单芯片数据纠正
单芯片数据纠正(Single Device Data Correction,SDDC)用来纠正单个持久内存介质芯片上的比特位错误,延长系统的运行时间,防止数据被破坏。SDDC由持久内存控制器管理,不需要微处理器、BIOS或者操作系统的支持。
(1)可纠正错误。
- 持久内存会纠正数据,并且把纠正好的数据发给主机;
- 可纠正的数据不会被传给微处理器。
(2)不可纠正错误。 - 持久内存控制器会把数据包括毒药标记发给主机;
- 持久内存控制器会在介质里创建一个记录,如果记录被启用,那么中断就会传给主机;
- 持久内存控制器会把出错的数据移到新的数据块,并且在介质里设置毒药标志位。错误发生以后,虽然持久内存可以继续工作,但是错误检测能力会降低,所以性能会下降。
2.双设备数据纠正
双设备数据纠正(Double Device Data Correction,DDDC)用来处理两个持久内存介质芯片上的比特位错误,延长系统的运行时间,防止数据被破坏。DDDC由持久内存控制器管理,不需要微处理器、BIOS或操作系统的支持。当第一个设备失效时,持久内存控制器会利用纠错码重建失效设备上的数据到另外一个空闲设备上,数据重建完成后,持久内存控制器的错误检测和纠正的能力将恢复正常。在第二个设备失效后,虽然持久内存仍然可以通过纠错编码进行数据读写,但是数据纠正功能降低了,所以性能会下降。
3.5 巡检
持久内存控制器内置了一个刷新引擎用来巡检(PatrolScrub),持久内存的巡检也被称为顺序刷新,和DRAM的巡检是各自独立运行的。该引擎会利用空闲的机会主动地搜索持久内存,可通过对持久内存的地址进行读操作,也可利用ECC修复可以纠正的错误。用户可以对刷新引擎的频率值进行编程,刷新引擎会根据这个频率对持久内存进行巡检访问,这样就可以有效地防止可纠正错误由于错误比特位的累积变 成不可纠正错误。只要有足够的时间,所有的持久内存的地址都会被访问到。
持久内存的巡检通常叫作“刷新”。
- 适用模式:内存模式和AD模式。
- 对于可纠正的错误,持久内存控制器会纠正数据并写回数据。
- 对于不可纠正的错误,持久内存控制器会用毒药在介质的元数据里标记错误,不可纠正错误会被记录到持久内存的介质,然后持久内存控制器会把数据移到新的位置。如果系统设置了中断,那么中断会被发给主机。
- 如果数据已经被标记成毒药,那么巡检时错误不会被记录和上传给系统。
3.6 地址区间检查
地址区间检查(Address Range Scrub,ARS)是ACPI规范里定义的DSM。BIOS和持久内存驱动可以通过ARS获取不可纠正错误的持久内存地址,以在持久内存被分配给应用程序使用之前获取状况良好的地址范围。和巡检相比,ARS检查内存地址的频率更高,但是更高的检查频率可能会影响持久内存硬件的服务质量,所以我们可以选择上一次ARS的结果,有时候也叫作快速ARS。
操作系统可以对有问题的持久内存不作映射,也可以标记成不可用空间,这样可以预防应用程序因为访问有问题的持久内存地址而崩溃。
为什么需要ARS?其原因如下。
- 巡检不会检查已经被标记成毒药的地址,但ARS可以有效地获取所有有问题的地址;
- 如果操作系统不清楚有问题的地址,应用程序一旦被分配到有不可纠正错误的持久化内存地址空间,读操作就会触发硬件错误异常,轻则应用程序崩溃,重则操作系统崩溃;
- 如果操作系统不清楚有问题的地址,在系统重启以后,操作系统很可能因为不可纠正错误而不停重启。ARS只有在AD模式下才会生效。
ARS可以在系统启动的时候自动启动,也可以在系统运行的时候手动启动。
3.7 病毒模式
系统发生不可恢复错误时,会采取多种措施减少错误的进一步扩散。大部分系统依赖毒药机制确保错误数据的抑制,坏数据包被标记成毒药并抑制其继续传输。操作系统可以选择终止可能使用错误数据的应用程序或虚拟机,来减少其扩散的机会。
对于毒药机制不能抑制的致命错误,为了延缓宕机增加可用性,系统可以选择更高级别的平台级错误抑制机制——病毒(viral)。启用病毒机制后,当发生致命错误时,病毒标志会扩散到UPI和PCIe接口。系统会在UPI数据包报头里设置病毒标志,并且把病毒状态扩散到其他的CPU。PCIe接口也进入病毒状态,此时所有PCIe设备的对内对外传输都会被丢弃。这样可以防止错误数据写入非易失性的存储设备或远程的网络设备。
持久内存也支持病毒机制,当持久内存控制器检测到病毒标志后:
- 在AD模式下,持久内存的写操作会被丢弃,读操作不受影响;
- 内存模式的写操作不受影响。病毒模式的退出:系统重启会清除病毒模式。
病毒模式的退出:系统重启会清除病毒模式。
3.8 错误报告和记录
错误报告包括错误记录和信号发送。从系统启动到系统运行,我们可能碰到各种错误,其中可纠正的错误由持久内存控制器来处理,不会上传给主机。如下几种不可纠正错误会被报告和记录:
- AD模式和内存模式下的数据事务错误;
- 持久内存控制器内部错误;
- 系统初始化和引导过程中的错误;
- 链路错误。
3.9 持久内存故障隔离
当系统发生可纠正错误或不可纠正错误时,必须把错误的信息发给用户。这是服务器设计厂商必须支持的功能,只有这样用户才能根据错误的性质决定采取何种措施,如替换有问题的DRAM或持久内存。为了实现正确的故障隔离,错误记录对于服务器系统设计有如下几个要求:
- 系统必须支持BIOS和BMC的RAS功能;
- 系统必须能区分设备错误和链路错误;
- 系统必须能区分出错的内存位置地址;
- 系统即使热启动也必须保证错误记录不丢失。
当系统检测到不可纠正错误时,错误的系统地址会被记录在微处理器的寄存器里,BIOS会进行下面的处理: - 映射系统地址到现场可更换单元;
- 如果现场可更换单元是持久内存,BIOS会查询持久内存的介质记录,寻找不可纠正错误。如果找到记录,BIOS会尝试把系统物理地址映射到持久内存的物理地址。
3.10 错误注入
服务器设计厂商需要测试RAS处理的能力,所以需要一个健壮的错误注入机制。持久内存同时支持DRAM的错误注入机制和持久内存的错误注入机制。DRAM的错误注入机制是由内存控制器来实现的,而持久内存的错误注入机制是由持久内存控制器来实现的,因为可纠正错误不会被上传给操作系统,所以错误注入机制只支持不可纠正错误的注入。