nvdimm

nvdimm(non-volatile dimm)是persistent memory的一种。persistent memory就是特殊的一种内存,它采用一般的内存插口(dimm),但是具备断电数据保存功能。它可以采用一般的cpu访问内存的方式load/store,其访问延时是dram级别的;但是它又具备flash式的断电保存功能。

至2018年初,市面nvdimm主要是nvdimm-n,它制作是采用dram+控制器+nand flash+超级电容(或者电池)。nvdimm控制器在系统异常断电时刻在特定的主板硬件信号和os驱动的配合下,可以将nvdimm中dram部分数据刷新到nand-flash中。在机器上电时刻控制器又可以将数据从nand-flash中读取到nvdimm 的dram部分。

nvdimm_第1张图片
主机访问nvdimm方式



nvdimm在主机os的使用有两种方式:

1、通过pmem方式使用

就是按照persistent内存的方式使用,cpu直接使用store和load方式访问nvdimm设备,跳过os内部的page cache,通用块层,也无需特别的驱动作为访问中转(因为此种访问方式是内存式访问)。

这种访问方式下,应用需要意识到nvdimm的存在,自己映射nvdimm一段存储空间,应用自己实现用户层cache。

上图中最右边的虚线和右侧第二条线都是这种访问方式。不同的是右侧第二条访问线需要os文件系统访问,但是文件系统需支持dax(direct access)属性(ext4,xfs已支持)——用户通过文件系统访问设备不过page cache、通用块层,直接使用mmap将文件映射到应用地址空间中,而文件位于nvdimm设备上。这样的好处在于用户可以使用文件系统实现的permission、quota等机制。


2、通过块设备(btt/sector)方式使用

通过块设备方式来访问nvdimm,这样的优势在于可以使用linuxkernel实现的软raid、mirror、加密/压缩等中间层驱动所带来的功能。由于nvdimm在硬件上不能保证针对块更新的原子性(指在突然掉电的时候,nvdimm不能保证按照block访问时刻,一个块是整体更新;可能存在半更新的情况)。需要通过os建立这种块的原子更新特性,引入btt(block translate table)来保证每次更新一个块都是原子的。所以在os内部针对nvdimm btt访问方式需要提供专门的驱动层。

btt的具体做法就是建立一个逻辑的lba和真实的lba之间的映射表,每次更新的时候,先完成物理lba的更新,然后再刷新btt标中块逻辑lba和块真实lba的对应关系。如此保证os每次进行更新nvdimm block时刻,都是完整的。


nvdimm_第2张图片
图片发自App


nvdimm_第3张图片
btt工作图



二、nvdimm上的其他概念

1、namespace和region

在nvdimm设备上,软件或者硬件可以将nvdimm设备划分几个区域。这几个不同的区域可以采用不同的访问方式它们分别是:pmem方式、Blk方式和 pmem+btt方式。这些区域就是namespace。所以namespac有大小、范围和访问方式这三个基本属性。

通过ndctl工具可以查看、创建和修改主机上的nvdimm的namespace。

一个或多个namespace组成了一个region,一个region内所有的namespace访问方式都必须是相同的。

访问方式只有:pmem、blk和pmem+blk的方式。

2、label

在nvdimm上记录哪一部分属于哪个namespace的一段存储区域。每个nvdimm都有一个。


nvdimm_第4张图片
region 、namespace和label



3、dpa

dimm 物理地址,是dimm上的偏移。当使用pmem方式时,dpa和spa(system 物理地址)是一对一的关系。

4、dsm

device specific method是acpi规定的访问设备特殊的方法(这里是指nvdimm的固件)

5、nfit

nvdimm firmware interface table 是acpi6.0协议定义的访问nvdimm固件的接口,libnvdimm在访问nvdimm设备的时候就使用此接口来访问nvdimm固件提供的功能(创建namespace等)


三、linux访问nvdimm涉及的组建

在linux上需要如下组建才能访问nvdimm:

1、内核模块:nv_pmem.ko,nv_btt.ko

2、用户态组建libnvdimm和ndctl程序

四、参考

suse nvdimm介绍

suse nvdimm操作方法

rhel nvdimm支持方法

你可能感兴趣的:(nvdimm)