以下内容基于NVMe2.0协议规范,第2章NVMe Base Specification – NVM Expresshttps://nvmexpress.org/developers/nvme-specification/
NVMe三种传输模型:
包括内存模型、消息模型、消息/内存模型(图片来自NVMe官方文档)
命名空间:
一个NVMe控制器可以支持多个命名空间,每个命名空间有一个namespace ID。
一个命名空间只对应一种I/O命令集。
命名空间通过Namespace Management和Capacity Management命令被创建和删除。
一个命名空间的capability和设置通过Identify Namespace结构体、IO命令集中的Identify Namespace结构体和Independent Identify Namespace结构体来表示。
基于内存的传输模型
与NVMe1.x一致,用于PCIe,不详细解释。
可参考(12条消息) NVMe 协议详解(一)_IFappy的博客-CSDN博客_nvme协议
基于消息的传输模型
用于NVMe-oF。与内存模型有以下不同:
1,I/O SQ和CQ之间是1对1的关系,不支持多个SQ对1个CQ。
2,没有定义Controller对host的中断,需要主机网络接口做这个中断的工作。
3,对于I/O SQ和CQ的创建与删除采用不同的机制。
4,不支持位于分离的缓冲区中的meta data,即不支持Metadata Pointer字段。
5,不支持PRP,支持SGL。Admin, I/O, Fabrics命令集都支持SGL。
6,不支持CQ流控。
7,只要host和controller约定好,可以禁用SQ流控。
NVM 子系统端口
一个NVM子系统可包含1至(64Ki-16)个controllers。
一个NVM子系统可包含一个或多个NVM子系统port。
一个NVM子系统port是子系统与网络之间的协议接口。1至多个物理网络接口可以形成一个协议接口,也就是一个NVM子系统port。
每个子系统port有一个16-bit标识符Port ID。每个子系统port由NQN和Port ID来唯一标识。
NQN是NVM Subsystem NVMe Qualified Name。
一个NVM子系统中的不同ports可以支持不同的NVMe传输。
一个NVM子系统port可以支持多个NVMe传输,前提是more than one NVMe Transport binding specifications exist for the underlying fabric,例如,一个port可以同时支持iWARP和RoCE。
在子系统中,controller和port之间可以自由分配。但是一旦建立连接,一个controller就和这个port建立了绑定。(一个controller只能绑定一个port,一个port可以和多个controller绑定)
一个controller一次只能关联一个host。
多个hosts可以通过同一个port连接不同的controllers。
NVMe-oF在多路径I/O和共享命名空间方面,与基于内存的传输模型相同。
探索服务(Discovery)
Discovery Service提供以下服务:
(1)为host发现NVM子系统及其命名空间;
(2)发现到一个NVM子系统的多条路径;
(3)发现静态配置的控制器;
(4)建立到Discovery controller的永久连接;(????)
(5)接收来自Discovery controller的异步事件通知。
Discovery Service是一个只能包含Discovery controller的NVM子系统,不支持其他类型的控制器。
Authentication
包括fabric secure channel和NVMe in-band authentication.