概述
NVMe协议将DIF信息作为元数据的一部分进行携带。
DIF数据格式
DIF的PI由多个字段组成,包括:
- Guard字段:基于逻辑块数据计算的CRC校验值(CRC-16、CRC-32或CRC-64),用于检测数据完整性。
- Application Tag:由上层应用定义,用于业务逻辑标识。
- Reference Tag:将数据与逻辑块地址(LBA)关联,防止写入错误位置。
盘片支持DIF
Format
使能NVMe DIF特性的前提是盘片需要格式化成支持DIF,协议提供了Format命令对盘进行格式化,其中有几个字段描述了对DIF的关键支持。
PIL
描述DIF信息在元数据中存放的位置,通常元数据的大小要超过8字节,8字节的DIF信息则通常放置在元数据的首部或尾部的位置,具体则取决于PIL字段的值:
- PIL=0:描述DIF信息存放于元数据的首部8个字节;
- PIL=1:描述DIF信息存放于元数据的尾部8个字节。
若元数据大小恰好为8字节,那么PIL设置成0或1都无所谓。
PI
PI描述了盘片使能的DIF类型,有4中取值,如下:
MSET
MSET描述了元数据的传输方式:分离或连续。
LBAF
LBAF描述了当前使用的扇区格式,常见的格式包括:512、512+8、4096以及4096+64等,盘片支持的元数据大小也由这个字段所指定。
协议命令DIF支持
NVMe读写命令中提供了两个字段:PRACT和PRCHK,用于描述了NVMe控制器对DIF数据的处理行为和校验方式。
PRACT
PRACT字段用于描述NVMe控制器是否对DIF信息进行插入、替换或剥离等处理,并与元数据大小有关,分为以下几种情况:
PRACT=0
无论携带的元数据多少,DIF信息都会原封不动进行传输,NVMe控制器不会对DIF信息进行修改;
PRACT=1
元数据传输过程中不会携带DIF信息,NVMe控制器会自动生成DIF信息下盘(Write命令)或剥离DIF信息(Read命令):
- 元数据大小为8字节:数据传输过程中不会携带DIF信息,等价于任何元数据也不会携带,NVMe控制器会针对读写命令处理DIF信息,插入或者剥离;
- 元数据大小超过8字节:数据传输过程中,元数据对应DIF区域不会携带有效的DIF信息,NVMe控制器会替换DIF区域数据后下盘,或剥离。
PRCHK
PRCHK描述了数据检验类型。
相关参考
- 《NVM-Express-Base-Specification-2.0c-2022.10.04-Ratified-1》