最近又入IB新坑,断更时间有点长,废话不多说,说正题:
nvme 1.4第一章节为nvme整体框架介绍,第一章节对于初学nvme者尤为重要,万不可因为协议内容枯燥随意跳过!
开篇介绍了NVMe接口的作用及spec发展由来,如果想要了解1.3-1.4版本差异,可以到官网了解,有效信息不多,关键字“subsystem”,后续也给出了subsystem的解释:
这里可以理解为一个NVM子系统可以包括多个控制器,多命名空间,和多个端口(双活等场景使用),以NVMe SSD为例,子系统可以简单理解为SSD硬盘。
该段描述NVMe的两种主要用途,一种是基于PCIE的独立非易失存储子系统(说人话就是NVMe SSD),另一种存储网络使用的传输协议(行业黑话:全闪阵列),本协议主要基于PCIE来进行说明。
后边两段介绍了该SPEC讲述的范围及哪些是SPEC不包括内容,不翻译了
重点来了
总结下上述NVMe主要优点介绍:
- 支持64K个IO queue,每个IO queue支持64K-1个待处理命令(根据CPU核数创建IO queue数量,IO
queue访问不用加锁,保证queue之间不会有抢占)。 - 不需要在命令提交或完成路径中读取不可缓存/MIMO寄存器;
- 命令提交流程最多一次MMIO操作写入;
- 每个IO queue有清晰的优先级仲裁机制;
- 完成4 KiB读取请求的所有信息都包含在64B命令本身中,以确保高效的小型I/O操作;
- 高效和精简的命令集(相对于SCSI/SATA);
- 支持MSI/MSI-X,支持中断聚合;
- 支持多命名空间;
- 高效的支持IO虚拟化架构,例如SR-IOV;
- 强大的错误报告和管理能力;
- 支持多路径IO和共享命名空间;
SPEC还定义了一组简化的寄存器用来配置一下功能:
- 控制器能力配置;
- 控制器错误状态;
- 管理队列配置;
- SQ/CQ数量可变对应的门铃寄存器;
第一段说明控制器数量和PCI Func数量关联,一个NVMe控制器对应一个PCI Func,能力可以通过Identify Controller获取。
第二段说明命名空间的管理方式:命名空间可以作为格式化最小单元,NVMe通过NSID来管理命名空间,可以通过Namespace Management and Namespace Attachment命令创建和删除命名空间,NSID:FFFFFFFFh可以作为操作所有命名空间的指定NSID。
这几段都是描述NVMe SQ/CQ使用介绍,最终通过下图展示以上几段想表述内容:
从上图可以得到信息:
1. 黄色箭头上下两部分,上方host表示为主机侧,下方Controller为SSD。该NVMe 子系统包含一组管理队列,每个主机CPU核对应一组IO 队列;
2. 所有的队列内存均在主机侧;
3. 黄色箭头方向表示数据传输方向,即SQ的生产者为主机侧,消费者为NVMe SSD,CQ生产者则为NVMe SSD,消费者为主机侧;
4. SQ与CQ一一对应。
该图中主机侧单个CPU核上绑定了多个SQ,且SQ与CQ为多个SQ对应一个CQ,SQ与CQ一一对应或者多个SQ对应一个CQ的使用方法协议均是允许的。
这里三段介绍内容总结:
1. SQ是主机侧环形buffer,主机软件投递一个或者多个SQE之后,写NVMe SSD尾门铃部寄存器,通知NVMe SSD控制器去处理命令,SSD从SQ中顺序去SQE一个一个处理命令
2. SQ 环境buffer对应的物理内存管理方式有两种,一种是PRP,一种是SGL(后续均有介绍)
3. CQ也是主机测环形buffer,每个CQE对应着一个SQE;多个SQ可以对应同一个CQ,主机可以用一个工作线程处理CQE,CQE处理之后,更新CQ 头指针。CQ有个反转标记(P),每处理一轮CQE之后,P反转一次。