材料说明:
文档《NVM-Express-1_4-2019.06.10-Ratified.pdf》来自于NVMe网站:https://nvmexpress.org/
笔记目的是学习NVMe基本概念,为学习NVMe over Fabric打基础,所以当前记录中与PCIe相关的内容,以及其他无关紧要的内容,都先跳过。
1 引言(入门简介)
1.2 内容范围
NVMe基础规格说明书为NVM subsystem中由controller负责的通信 定义寄存器接口。【注:对于NVMe over Fabric来说,使用软件仿真controller,不一定是物理寄存器】。它还定义了可能需要通过controller支持的标准命令集。
controller有三类型,分别具有不同的功能能力:
a) I/O controllers;
b) discovery controllers; 【注:NVMe over Fabric重点关注】
c) administrative controllers.【注:NVMe基础规格说明书 v1.4新增内容,administrative controllers目的是仅提供NVM subsystem管理功能,不支持访非易失存储的逻辑块数据和元数据。实际上administrative controllers提供的NVM subsystem管理功能在I/O controllers上都具有】
在后边的描述中,通常使用术语controller而不是列举出相关controller类型,可能需要结合上下文来判断对应的类型。
1.4 操作原理
NVMe精心设计了有限的接口来解决企业和客户使用基于PCIe固态盘或网络连接设备的系统需求。这些接口提供最佳命令提交和完成路径。包括为便于并行操作而支持到65535个I/O队列,每个I/O队列最大可以支持64k个待处理的命令。另外,还添加了许多企业功能,例如端到端数据保护(兼容知名的T10 DIF和SNIA DIX标准),增强的错误报告,虚拟化。
接口具有如下关键属性特征:
- 在命令提交或完成路径中无需读取不可缓存/MMIO寄存器;
- 在命令提交路径中一个MMIO寄存器最大极限的写是非常有必要的;
- 最大支持到65535个I/O队列,每个I/O队列支持存放65535个待处理的命令【即:每个I/O队列深度是64k】;
- 每个I/O队列对应一个优先级,具有明确定义的仲裁机制;
- 确保高效的小I/O操作,完成一个4KB读请求的所有信息都包含在64字节命令自身中;【?-待详细解释】
- 高效和合理的命令集;
- 支持MSI/MSI-X和中断聚合;
- 支持多namespace;
- 有效的支持像SR-IOV这样的I/O虚拟化架构;
- 健壮的错误报告和管理能力;
- 支持多路径I/O和共享namespace。
本NVMe基础规格说明书定义一个寄存器的改进的集,包括以下功能:
- controller功能能力特征;
- controller失败状态(命令状态是通过CQ被直接处理的);
- Admin队列配置(I/O队列配置是用Admin命令处理的);
- 为有限数量的提交和完成队列使用的门铃寄存器
一个NVMe controller关联单一的一个PCI Function。应用于整个controller的功能能力和设置在Controller Capabilities(CAP)寄存器和Identify Controller数据结构中被表示指出。
一个namespace是大量可以被格式化成多个逻辑块的非易失存储。一个NVMe controller可以支持多个namespace,使用namespace ID来引用。namespace可以使用Namespace Management和Namespace Attachment命令来创建和删除。Identify Namespace数据结构显示具体特定namespace的功能能力和设置。用于namespace ID FFFFFFFFh的所有namespace公共的功能能力和设置通过Identify Namespace数据结构来公告。
NVMe接口基于一个提交和完成队列对机制。命令Command被主机软件放入到一个提交队列Submission Queue(SQ)中,完成Completion被controller放入相应的完成队列Completion Queue(CQ)。多个提交队列可以使用同一个完成队列【注:多个SQ公用一个CQ仅限于NVMe over PCIe,在NVMe over Fabric中SQ和CQ是一对一的关系】。SQ和CQ从内存中申请。
Admin SQ和对应的CQ存在的目的是为了controller管理和控制(例如I/O SQ和CQ的创建和删除,异常终止命令等)。只有Admin Command S