Trends
目的
为了使内存/存储堆栈更高效,有必要合并不同的堆栈层,以减少数据复制和移动。而我们研究 NVM 的目的就在于我们想让内存/存储堆栈具有以下特点:
- 低延迟
- 高密度
- 低开销
- 高可扩展性
- 可靠性
- 耐用性
虽然目前没有一种存储技术可以提供以上全部的特性,但是 NVM 可以缩小内存与存储之间的距离。在这个观点的驱动下,人们致力于创建标准、接口、功能和编程模型等,以使操作系统、编程语言和应用程序能够有效地采用和使用 NVM。
工具和标准
-
ACPI(Advanced Configuration and Power Interface):
从6.0版本开始,加入了对 NVDIMM 的固件接口的支持。ACPI 与 UEFI 知乎专栏 -
The JEDEC Byte Addressable Energy Backed Interface:
目的是为简化 BIOS 和 PM 的访问,具体做法是向 OS 提供了一个简化的接口。 -
Linux PMEM 驱动:
Linux PMEM 基于 BRD(Block RAM Driver),BRD 设计之初是为了支持 NVMDIMM。PMEM 在 Linux Kernel 4.1 之后加入。PMEM 使用系统保留的内存寻址范围,PMEM 允许用户模拟持久内存,因此无论内存是否是非易失内存,都可以创建并挂载文件系统。目前,PMEM 驱动程序正在更新,以支持 ACPI NFIT 的特性。
同时 PMEM 也支持把非易失内存模拟为块设备,作为块设备管理非易失内存,可以避免坏块等内存错误导致的系统崩溃等问题,同时块设备的原子性也可以得到保证。 -
DAX(Direct Access):
DAX 的思想与 XIP (eXecute In Place)十分类似,DAX 的核心思想是绕过 Linux 的 page cache,尽可能避免页面副本带来的额外开销,通过 DAX,应用软件可以直接通过 mmap 访问 PM,为了支持 DAX,文件系统和块驱动程序必须实现组成 DAX 接口的几个函数,从而允许内核执行特定的操作,比如使用页帧号分配页。
体系结构支持和一些限制
对 PM 的体系结构支持目前还存在缺失,一个例子是当前处理器的有限的物理寻址能力,对于 TB 甚至 PB 级别的 PM,显然超出了当前处理器的寻址能力,目前的处理方法是把 PM region 映射到 CPU 的物理地址空间,但是由此带来的影响目前尚不清楚:这种方式增加了 TLB 和 cache 的 miss,增加了内存归零和复制大量内存的开销,显然内存的扩展是处理器设计所需要考虑的一个重要内容。
处理器的 cache 并未针对 PM 做出优化,而目前的一些 barrier 原语以及 cache flush 操作虽然有助于 PM 的处理(个人感觉体现在数据一致性和持久性上面),但是由于其昂贵的开销导致了性能缺陷,我所理解文中的意思应该是因为这些操作大多是序列化操作,我们知道一些强序列的指令在 CPU 中是有可能让整个流水线停顿的,因此会带来很大的性能缺陷。而且当 cache line 刷新的时候,通常不保证直接接写回 NVM,关于这部分可以查看体系结构中 store buffer 等内容(不要脸的放上自己写的内