当前位置: 首页 > 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站 用户: 专注与守望

相关文章:

  • C# 通过脚本实现接口
  • centos6.10在Macbook m芯片上使用
  • OpenCV CUDA 模块中用于在 GPU 上计算矩阵中每个元素的绝对值或复数的模函数abs()
  • 地磁-惯性-视觉融合制导系统设计:现代空战导航的抗干扰解决方案
  • 合并有重叠的时间区间的极简方法
  • [原创](现代Delphi 12指南):[macOS 64bit App开发]: 获取macOS App的Bundle路径信息.
  • RK3588 串行解串板,支持8路GMSL相机
  • 应用示例1:交通灯
  • [思维模式-38]:看透事物的关系:什么是事物的关系?事物之间的关系的种类?什么是因果关系?如何通过数学的方式表达因果关系?
  • postman 用法 LTS
  • Go语言空白导入的作用与用途
  • 深度解析 Sora:从技术原理到多场景实战的 AI 视频生成指南【附学习资料包下载】
  • uniapp设置 overflow:auto;右边不显示滚动条的问题
  • CMakeLists生成调用静态动态库可执行demo
  • Linux复习笔记(五) 网络服务配置(dhcp)
  • MetaHipMer2:从头组装宏基因组
  • 基于地图的数据可视化:解锁地理数据的真正价值
  • 正则表达式r前缀使用指南
  • 【原创】使用阿里云存放一个临时共享的文件
  • 《AI大模型应知应会100篇》第61篇:FastAPI搭建大模型API服务
  • 证券时报:中美互降关税落地,订单集中补发港口将迎高峰期
  • “救护车”半路加价?陕西卫健委已介入,记者调查:黑救护车挤占市场
  • 云南大理铁路枢纽工程建设取得两大进展,预计明年建成
  • 小米SU7 Ultra风波升级:数百名车主要求退车,车主喊话雷军“保持真诚”
  • 这一次,又被南昌“秀”到了
  • 观众走入剧院空间,人艺之友一起“再造时光”