当前位置: 首页 > news >正文

浅析NVMe协议:DIF

文章目录

    • 概述
    • DIF数据格式
    • 盘片支持DIF
      • Format
        • PIL
        • PI
        • MSET
        • LBAF
    • 协议命令DIF支持
      • PRACT
        • PRACT=0
        • PRACT=1
      • PRCHK
    • 相关参考

概述

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》
http://www.dtcms.com/a/360557.html

相关文章:

  • 多线程使用场景一(es数据批量导入)
  • 林曦词典|老死不相往来
  • 洛谷p2392kkksc03考前临时抱佛脚 详解(回溯,深度搜索法)
  • 大模型参数到底是什么?
  • CUDA与图形API的深度互操作:解锁GPU硬件接口的真正潜力
  • C++内存序不迷茫:从CPU缓存一致性理解Memory Order
  • 如何将剪贴板内容存为文件?Paste As File支持文本/图片转换
  • 批处理脚本操作 JSON 文件
  • centos7挂载iscis存储操作记录
  • Java学习笔记(前言:开发环境配置)
  • 五分钟聊一聊AQS源码
  • 【系统架构师设计(五)】需求工程上:需求开发与需求管理概述、结构化需求分析法
  • 【PyTorch】基于YOLO的多目标检测(一)
  • Trae接入自有Deepseek模型,不再排队等待
  • C# .Net8 WinFormsApp使用日志Serilog组件
  • 【IO学习】IO基础和标准IO函数
  • 生物学自然主义:心灵哲学中的生物性探索
  • 《程序员修炼之道》第七八九章读书笔记
  • 栈的基本概念介绍
  • kafka、RabbitMQ结构
  • Qt QNetworkAccessManager 简述及例程
  • 畅问AI-AI机器人对话平台
  • dayjs ​JavaScript 时间日期处理库
  • 力扣hot100:轮转数组(常规思路与三步反转讲解)(189)
  • C#基础(②音乐播发器MCI(Media Control Interface))
  • CMake⼯程指南-3
  • 手写MyBatis第45弹:动态代理在MyBatis插件内核是如何织入扩展逻辑的
  • Linux软件升级方法总结
  • CF每日3题(1500-1600)
  • 在windows系统下安装Docker Desktop后迁移镜像位置