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

NVMe简介2

共分2部分,这里是第2部分。

NVMe数据结构

NVMe协议中规定每个提交命令的大小为64字节,完成命令大小为16字节,NVMe命令分为Admin和IO两类,NVMe的数据块组织方式有PRP和SGL两种。提交命令的格式如图5所示。
在这里插入图片描述
图5 提交命令数据格
NVMe提交命令的数据格式属性如下:
(1)Opcode(OPC):命令操作码,不同操作命令的Opcode都有相应的值;
(2)Fused Operation(FUSE):融合操作,可选字段,用于将两个命令融合为一条命令;
(3)PRP or SGL for Data Transfer(PSDT):PRP或SGL数据传输;
(4)Command Identifier(CID):命令ID;
(5)Namespace Identifier(NSID):命名空间ID;
(6)Metadata Pointer(MPTR):元数据指针;
(7)PRP Entry 1/2:物理区域页项;
(8)SGL Entry:散列聚合列表。

Admin命令集定义了可以提交到Admin SQ的命令。NVM命令集定义了可以提交到IO SQ的命令。表1和表2分别列出了Admin命令集和NVM命令集中的常用命令、操作码和简要的功能描述。
表1 Admin命令集
在这里插入图片描述
表2 NVM命令集在这里插入图片描述
接下来分析NVMe协议中的寻址方式。在NVMe协议中定义了两种寻址方式,PRP和SGL。通过PRP和SGL来记录Host内存中物理页的位置。NVMe命令中的PRP和SGL字段用来向NVMe SSD传递将要读写数据在内存中的位置。NVMe协议中规定Admin命令只能通过PRP告诉NVMe SSD命令在内存中物理地址。而SGL主要是在NVMeoF中使用,因此本设计将采用PRP寻址方式。

Host可以通过配置NVMe Controller的CC.MPS寄存器来设定物理页的大小,物理页的大小可设定的范围是4KB~128MB之间。物理页对应的地址记录在PRP Entry中,PRP Entry的数据格式。PRP Entry的数据格式由物理页起始地址和页偏移地址两部分组成,如图6所示。由于物理地址只能是四字节对齐,因此将偏移地址的最低2bit置为0。此外,图6中n的取值与设置的物理页大小有关,例如,将物理页大小设置为4KB,则n=11,通过偏移地址[11:2]来表示在一个内存页内的偏移地址。
在这里插入图片描述
图6 NVMe之PRP数据格式

一个PRP Entry只能指向一个物理页。NVMe协议中只定义了两个PRP Entry,当传输数据量大小大于两个内存页大小时,PRP Entry2将不指向物理页,而是指向由若干个PRP组成的PRP List。如图7所示,NVMe命令中的PRP1指向第一个内存页,PRP2指向一个新的PRP链表的首地址。如果需要指定更大的内存空间可以通过每一个PRP List的最后一个PRP Entry指向新的PRP List。
在这里插入图片描述
图7 NVMe命令中的 原理示意图

完成命令的数据格式如图8所示。
在这里插入图片描述
图8 NVMe完成命令格式
NVMe完成队列的命令格式属性如下:

(1)SQ Header pointer:SQ头指针;
(2)SQ Identifier:SQ ID;
(3)Command Identifier:命令ID;
(4)P:相位标志phase tag,完成队列没有head/tail交互,通过相位标志实现完成队列项的释放;
(5)Status Field:状态域。

4 NVMe工作流程
NVMe协议中的Admin命令和IO命令执行流程相同,主要通过SQ、CQ和DB寄存器三个关键部件之间的相互协作来完成。NVMe的命令处理流程分为了8个步骤,如图9所示。

在这里插入图片描述
图9 NVMe简介完成命令处理流程

Host和SSD之间通过更新DB(DoorBell)寄存器的值来实现队列信息的交互。每个SQ和CQ都拥有一个Head寄存器和Tail寄存器。对于SQ而言,Host是生产者,负责向队列发送提交命令,SSD是消费者,负责执行命令,因此Host负责更新Tail DB寄存器,SSD负责更新Head DB寄存器。对于CQ而言,SSD是生产者,负责向队列发送完成命令,Host是消费者,负责检查完成信息,因此SSD负责更新Tail DB寄存器,Host负责更新Head DB寄存器。而DB寄存器都存在于SSD内,且只能进行写操作,不能进行读操作。因此NVMe协议中规定SSD通过完成信息向Host反馈CQ Tail和SQ Head寄存器的值。

NVMe命令处理的步骤如下:

(1)主机提交新的NVMe命令。主机生成新的NVMe命令并添加ID号后,将其存放在SQ Tail指针指向的内存空间中;
(2)主机更新SQ Tail DB寄存器。主机通过Memory Write事务更新SQ Tail DB寄存器的值,以通知NVMe SSD控制器去主机端读取SQ中缓存的命令;
(3)NVMe SSD读取命令。NVMe SSD控制器检测到SQ Tail DB寄存器的变化后,通过Memory Read事务去读取SQ内缓存的命令,这个过程,NVMe SSD进行突发读取,一次读取多条命令,等待取命令完成后更新SQ Head DB寄存器的值;
(4)NVMe SSD执行命令。NVMe SSD控制器根据内部的仲裁机制来执行读取到的NVMe命令,其执行过程并不是按照队列的先后顺序来执行命令;
(5)NVMe SSD控制器将完成命令写入CQ。NVMe SSD控制器将NVMe命令的执行结果写入主机的CQ内存区域中,完成命令包括NVMe命令中的ID号和SQ Head DB寄存器的值;
(6)NVMe SSD通知主机检查完成命令。NVMe SSD控制器通过Memory Write事务向主机发出MSI-X中断信号,告知主机检查CQ中的完成信息。在本设计中,取消了完成队列的设计,而采用FPGA的并行处理方式,通过主机端实时监测CQ信息,以节省硬件资源和提高NVMe命令处理速度;
(7)主机检查完成命令。主机从CQ内存中读取完成信息,并根据状态字段判断NVMe命令的执行情况。若命令已经执行完成,主机会释放该ID号对应的提交命令空间,以便给新的命令使用;
(8)主机更新CQ Head DB寄存器。主机通过Memory Write事务更新CQ Head DB寄存器的值,以通知NVMe SSD控制器CQ中的完成信息已经检查。
对相关NVM安e设计感兴趣的可以看本博客,或视频见B站 用户: 专注与守望

http://www.xdnf.cn/news/441919.html

相关文章:

  • UniApp 微信小程序绑定动态样式 :style 避坑指南
  • 电脑开机提示按f1原因分析及解决方法(6种解决方法)
  • Baklib内容中台AI革新智能服务实践
  • 【评测】免费体验dify工作流模式下腾讯语音转文字speech2text服务
  • 软件逆向基础-CE篇
  • 剖析提示词工程中的递归提示
  • 安全合规检查开源项目ComplianceAsCode/content详解及操作系统新产品开发适配指南
  • upload-labs通关笔记-第5关 文件上传之.ini绕过
  • 探索AI新领域:生成式人工智能认证(GAI认证)助力职场发展
  • 全流量解析:让安全防御从“被动挨打”升级为“主动狩猎”
  • 一分钟了解大语言模型(LLMs)
  • 濒危仙草的重生叙事:九仙尊米斛花节如何以雅集重构中医药文化IP
  • NNLM神经网络语言模型总结
  • react中安装依赖时的问题 【集合】
  • Android Studio Meerkat与Gradle构建工具升级实战指南
  • 2025年中国主流DevOps平台对比分析:Gitee、阿里云效与GitLab CE的技术适配与合规实践全景解读
  • excel使用笔记
  • Qt笔记---》.pro中配置
  • 【IDEA】注释配置
  • 西门子WinCC Unified PC的GraphQL使用手册
  • 常见排序算法及其java实现
  • 《Python星球日记》 第69天:生成式模型(GPT 系列)
  • JVM学习专题(二)内存模型深度剖析
  • STMCubeMX使用TB6612驱动编码轮并进行测速
  • 微信开发者工具里面模拟操作返回、录屏、网络速度、截屏等操作
  • 94. 二叉树的中序遍历详解:迭代法核心逻辑与出入栈模拟
  • 关于数据湖和数据仓的一些概念
  • 深入解析JVM字节码解释器执行流程(OpenJDK 17源码实现)
  • 44、私有程序集与共享程序集有什么区别?
  • 工具学习_模糊测试