NVM Express 1

1引言

1.1概述

NVM ExpressTM (NVMeTM) 接口允许主机软件与非易失性内存子系统进行通信。此接口针对企业和客户端固态硬盘进行了优化,通常作为寄存器级接口连接到 PCI Express 接口。

注意:在开发过程中,此规范称为企业 NVMHCI。但是,在完成之前,该名称已修改为 NVM Express 基本规范。此接口面向客户端和企业系统使用。

有关从修订版 1.3 到修订版 1.4 的更改概述,请参阅 http://nvmexpress.org/changes 以获取描述新功能的文档,包括控制器遵守修订版 1.4 的强制性要求。

1.1.1基于 PCIe® 的 NVMeTM 和基于结构的 NVMeTM

NVM Express 基本规范修订版 1.4 和之前的修订版定义了一个寄存器级接口,用于主机软件通过 PCI Express 与非易失性内存子系统(NVMeTM over PCIeTM)进行通信。NVMeTM over Fabrics 规范定义了协议接口和 NVMe 接口的相关扩展,这些扩展支持在其他互连(例如以太网、InfiniBand™、光纤通道)上运行。NVMe over Fabrics 规范为每个 NVMe 传输都有一个 NVMe 传输绑定(在该规范中或通过引用)。

在本规范中,要求/功能可能记录为特定于 NVMe over Fabrics 实现或特定 NVMe 传输绑定。此外,基于 PCIe 的 NVMe 和基于 Fabrics 的 NVMe 实现对特性和功能的支持要求可能有所不同。

1.2 范围

该规范定义了一个寄存器接口,用于与 NVM 子系统中的控制器进行通信。它还定义了控制器可能支持的标准命令集。有三种类型的控制器具有不同的功能:

  1. a) I/O 控制器;
  2. b) 发现控制器;
  3. c) 行政控制人(参见第 7.1 节)。

在本文档中,当可以从上下文中确定适用的控制器类型时,通常使用通用术语控制器,而不是枚举特定的控制器类型。

1.3 范围之外

寄存器接口和命令集与NVM的任何使用模型分开指定,而仅指定到NVM子系统的通信接口。因此,本规范并未具体说明非易失性存储器系统是否用作固态驱动器、主存储器、高速缓存器、备份存储器、冗余存储器等。特定的使用模型不在范围内,是可选的,并且未经许可。

此接口指定在任何非易失性内存管理(如磨损均衡)之上。NAND等NVM技术的擦除和其他管理任务被抽象化。

本规范不包含有关缓存算法或技术的任何信息。

本规范中提及的其他已发布规范的实施或使用,即使需要符合规范,也不在本规范的范围之内(例如,PCI、PCI Express 和 PCI-X)。

1.4 工作原理

NVM Express 可扩展接口旨在满足使用基于 PCI Express 的固态驱动器或织物连接设备的企业和客户端系统的需求。该接口提供优化的命令提交和完成路径。它包括对并行操作的支持,支持多达 65,535 个 I/O 队列,每个 I/O 队列最多 64 Ki - 1 个未完成的命令。此外,还添加了对许多企业功能的支持,例如端到端数据保护(与 SCSI 保护信息(通常称为 T10 DIF 和 SNIA DIX 标准)兼容)、增强的错误报告和虚拟化。

该接口具有以下关键属性:

  • • 在命令提交或完成路径中不需要不可缓存/MMIO 寄存器读取;
  • • 命令提交路径中最多需要一次 MMIO 寄存器写入;
  • • 支持多达 65,535 个 I/O 队列,每个 I/O 队列支持多达 65,535 个未完成命令;
  • • 与每个 I/O 队列关联的优先级,具有明确定义的仲裁机制;
  • • 完成 4 KiB 读取请求的所有信息都包含在 64B 命令本身中,确保高效的小型 I/O 操作;
  • • 高效、精简的命令集;
  • • 支持 MSI/MSI-X 和中断聚合;
  • • 支持多个命名空间;
  • • 高效支持 SR-IOV 等 I/O 虚拟化架构;
  • • 强大的错误报告和管理能力;
  • • 支持多路径 I/O 和命名空间共享。

本规范定义了一组简化的寄存器,其功能包括:

  • • 控制器功能的指示;
  • • 控制器故障状态(命令状态直接通过 CQ 处理);
  • • 管理员队列配置(通过管理员命令处理的 I/O 队列配置);
  • • 门铃寄存器,用于可扩展数量的提交和完成队列。

NVM Express 控制器与单个 PCI 功能相关联。适用于整个控制器的功能和设置在控制器功能 (CAP) 寄存器和识别控制器数据结构中指示。

命名空间是可以格式化为逻辑块的非易失性内存量。NVM Express 控制器可能支持使用命名空间 ID 引用的多个命名空间。可以使用 Namespace Management 和 Namespace Attachment 命令创建和删除命名空间。“识别Namespace”数据结构指示特定于特定命名空间的功能和设置。所有命名空间通用的功能和设置由命名空间 ID FFFFFFFFh 的标识 Namespace 数据结构报告。

NVM Express 接口基于配对的提交和完成队列机制。命令由主机软件放入提交队列中。控制器将完成项放入关联的完成队列中。多个提交队列可以使用相同的完成队列。提交队列和完成队列在内存中分配。

存在管理员提交和关联的完成队列,用于控制器管理和控制(例如,创建和删除 I/O 提交和完成队列、中止命令等)。只有属于管理员命令集的命令才能提交到管理员提交队列。

I/O 命令集与 I/O 队列对一起使用。此规范定义了一个 I/O 命令集,称为 NVM 命令集。主机选择一个 I/O 命令集,该命令集用于所有 I/O 队列对。

主机软件创建队列,最高可达控制器支持的最大值。通常,创建的命令队列数取决于系统配置和预期的工作负载。例如,在基于四核处理器的系统上,每个内核可能有一个队列对,以避免锁定并确保在适当的处理器内核的缓存中创建数据结构。图 1 提供了队列对机制的图形表示,显示了提交队列和完成队列之间的 1:1 映射。图 2 显示了一个示例,其中多个 I/O 提交队列在核心 B 上使用相同的 I/O 完成队列。图 1 和图 2 显示管理员提交队列和管理员完成队列之间始终存在 1:1 映射。

图 1:队列对示例,1:1 映射

图 2:队列对示例,n:1 映射

提交队列 (SQ) 是一个具有固定插槽大小的圆形缓冲区,主机软件使用它来提交命令以供控制器执行。当有一到 n 个新命令要执行时,主机软件会更新相应的 SQ Tail 门铃寄存器。当有新的门铃寄存器写入时,控制器中会覆盖之前的 SQ Tail 值。控制器按顺序从提交队列中获取 SQ 条目,并可以按任何顺序执行这些命令。

每个 Submission Queue 条目都是一个命令。命令的大小为 64 个字节。内存中用于数据传输的物理内存位置是使用物理区域页 (PRP) 条目或分散收集列表指定的。每个命令可能包含两个 PRP 条目或一个分散收集列表 (SGL)段。如果需要两个以上的 PRP 条目来描述数据缓冲区,则提供指向描述 PRP 条目列表的 PRP 列表的指针。如果需要多个 SGL 段来描述数据缓冲区,则 SGL 段将提供指向下一个 SGL 段的指针。

完成队列(CQ)是一个循环缓冲区,具有固定的插槽大小,用于发布已完成命令的状态。已完成的命令由关联的 SQ 标识符和主机软件分配的命令标识符的组合唯一标识。多个提交队列可能与单个完成队列相关联。当单个工作线程通过一个完成队列处理所有命令完成时,可以使用此功能,即使这些命令来自多个提交队列。在处理完指示最后一个空闲CQ插槽的完成队列条目后,主机软件会更新CQ Head指针。在完成队列条目中定义了一个阶段标记 (P) 位,用于指示条目是否是在未查阅寄存器的情况下新发布的。这使主机软件能够确定新条目是作为上一轮完成通知的一部分发布还是作为当前一轮完成通知的一部分发布。具体来说,每一轮通过 Completion Queue 条目,控制器都会反转 Phase Tag 位。

1.4.1 多路径 I/O 和 Namespace 共享

本节概述了多路径 I/O 和命名空间共享。多路径 I/O 是指单个主机和命名空间之间的两个或多个完全独立的路径,而命名空间共享是指两个或多个主机使用不同的 NVM Express 控制器访问公共共享命名空间的能力。多路径 I/O 和命名空间共享都要求 NVM 子系统包含两个或多个控制器。支持多路径 I/O 和 Namespace 共享的 NVM 子系统也可能支持非对称控制器行为(请参阅第 1.4.2 节)。两个或多个主机并发访问共享命名空间需要主机之间进行某种形式的协调。用于协调这些主机的过程超出了本规范的范围。

图 3 显示了一个 NVM 子系统,其中包含一个 NVM Express 控制器和一个 PCI Express 端口。由于这是单功能 PCI Express 设备,因此 NVM Express 控制器应与 PCI 功能 0 相关联。控制器可以支持多个命名空间。图 3 中的控制器支持两个标记为 NS A 和 NS B 的命名空间。与每个控制器命名空间相关联的是一个命名空间 ID,标记为 NSID 1 和 NSID 2,控制器使用它来引用特定命名空间。命名空间 ID 与命名空间本身不同,是主机和控制器用于在命令中指定特定命名空间的句柄。控制器的命名空间 ID 的选择超出了本规范的范围。在此示例中,命名空间 ID 1 与命名空间 A 关联,命名空间 ID 2 与命名空间 B 关联。这两个命名空间对控制器都是私有的,此配置既不支持多路径 I/O,也不支持命名空间共享。

图 3:具有两个命名空间的 NVM Express 控制器

图 4:具有两个控制器和一个端口的 NVM 子系统

图 4 显示了一个多功能 NVM 子系统,该子系统具有一个包含两个控制器的 PCI Express 端口,一个控制器与 PCI 功能 0 关联,另一个控制器与 PCI 功能 1 关联。每个控制器都支持单个私有命名空间和对共享命名空间 B 的访问。在有权访问特定共享命名空间的所有控制器中,命名空间 ID 应相同。在此示例中,两个控制器都使用命名空间 ID 2 来访问共享命名空间 B。

每个控制器都有一个唯一的 Identify Controller 数据结构,每个命名空间都有一个唯一的 Identify Namespace 数据结构。有权访问共享命名空间的控制器返回与该共享命名空间关联的 Identify Namespace 数据结构(即,有权访问同一共享命名空间的所有控制器都返回相同的数据结构内容)。有一个与命名空间本身关联的全局唯一标识符,可用于确定何时存在指向同一共享命名空间的多个路径。请参阅第 7.10 节。

与共享命名空间关联的控制器可以同时在命名空间上运行。各个控制器执行的操作在提交命令的控制器的写入原子级别上对共享命名空间是原子的(请参阅第 6.4 节)。在共享命名空间的控制器之间,不需要写入原子级别相同。如果向访问共享命名空间的不同控制器发出的命令之间存在任何排序要求,则需要主机软件或关联的应用程序来强制执行这些排序要求。

图 5 展示了一个具有两个 PCI Express 端口的 NVM 子系统,每个端口都有一个关联的控制器。两个控制器都映射到相应端口的 PCI 功能 0。此示例中的每个 PCI Express 端口都是完全独立的,并具有自己的 PCI Express 基本复位和参考时钟输入。端口的重置仅影响与该端口关联的控制器,而不会影响其他控制器、共享命名空间或其他控制器在共享命名空间上执行的操作。此示例的功能行为与图 4 中所示的行为相同。

图 5:具有两个控制器和两个端口的 NVM 子系统

图 5 中所示的两个端口可能与相同的根复合体相关联,也可能与不同的根复合体相关联,并可用于实现多路径 I/O 和 I/O 共享架构。系统级架构方面和 PCI Express 结构中多个端口的使用超出了本规范的范围。

图 6 展示了一个 NVM 子系统,该子系统支持单根 I/O 虚拟化 (SR-IOV),并具有一个物理功能和四个虚拟功能。NVM Express 控制器与每个函数相关联,每个控制器都有一个私有命名空间,并可以访问所有控制器共享的命名空间,标记为 NS F。此示例中控制器的行为与本节中其他示例的行为相似。有关 SR-IOV 的更多信息,请参阅第 8.5.4 节。

图 6:支持单根 I/O 虚拟化 (SR-IOV) 的 PCI Express 设备

本节中提供的示例旨在说明概念,并非旨在列举所有可能的配置。例如,NVM 子系统可能包含多个 PCI Express 端口,每个端口都支持 SR-IOV。

1.4.2 非对称控制器行为

非对称控制器行为发生在 NVM 子系统中,其中命名空间访问特性(例如性能)可能因以下因素而异:

  • • NVM 子系统的内部配置;或
  • • 哪个控制器用于访问命名空间(例如,Fabrics)。

提供非对称控制器行为的 NVM 子系统可能支持非对称Namespace访问报告,如第 8.20 节所述。

1.5 约定

对于标记为保留的所有位和寄存器,硬件应返回“0”,主机软件应写入值为 0h 的所有保留位和寄存器 在寄存器部分(即第 2 节和第 3 节)内,使用以下术语和缩写:

RO 只读

RW 读写

R/W 读写。

读取的值可能不是最后写入的值。RWC 读/写 '1' 清除 RWS 读/写 '1' 设置 Impl Spec 实现特定 – 控制器可以自由选择其实现。HwInit 默认状态取决于 NVM Express 控制器和系统配置。重置 对于第 2 部分,此列指示重置后字段的值。根据相应的 PCI 或 PCI Express 规范定义。对于第 3 节,此列表示第 7.3.2 节中定义的控制器级别重置后字段的值。对于某些寄存器字段,它是特定于实现的,即字段是 RW、RWC 还是 RO;这通常显示为 RW/RO 或 RWC/RO,以指示如果该功能不受支持,则该字段是只读的。当文档中引用寄存器字段时,使用的约定是“寄存器符号.字段符号”。例如,PCI 命令寄存器奇偶校验错误响应启用位由名称 CMD.PEE 引用。如果寄存器字段是位数组,则该字段称为“寄存器符号.字段符号(数组偏移到元素)”。基于 0 的值是一种编号方案,其中数字 0h 代表 1h,1h 代表 2h,2h 代表 3h,以此类推。在此编号方案中,没有方法来表示 0h 的值。除非另有说明,否则本规范中的值以 1 为基础(即数字 1h 代表 1h 的值,2h 代表 2h 等)。大小值以二进制单位或十进制单位显示。用于表示这些值的符号如图 7 所示。

1.6.29 NVM

NVM是非易失性存储器的首字母缩写。

1.6.30 NVM Set

来自耐久组的一部分NVM 。请参阅第 4.9 节。

1.6.31 NVM 子系统

NVM 子系统包括一个或多个控制器、零个或多个命名空间以及一个或多个端口。NVM 子系统可以包括非易失性内存存储介质以及 NVM 子系统中的控制器与非易失性内存存储介质之间的接口。

1.6.32 主控制器

支持虚拟化管理命令的 NVM Express 控制器。一个 NVM 子系统可能包含多个主控制器。NVM 子系统中的辅助控制器依赖于主控制器进行动态资源管理(请参阅第 8.5 节)。支持 NVM Express 接口和虚拟化增强功能的 PCI Express SR-IOV 物理功能是主控制器的一个示例(请参阅第 8.5.4 节)。

1.6.33 私有命名空间

一次只能连接到一个控制器的命名空间。主机可以通过 Identify Namespace 数据结构中 Namespace Multipath I/O 和 Namespace Sharing Capabilities (NMIC) 字段的值来确定命名空间是私有命名空间还是共享命名空间。

1.6.34 运行时 D3(断电)

在运行时 D3 (RTD3) 中,主电源从控制器中断开。可能会提供辅助电源,也可以不提供辅助电源。对于 PCI Express,RTD3 是 D3cold 电源状态(请参阅第 8.4.4 节)。

1.6.35 清理操作

更改 NVM 子系统中的所有用户数据的过程,以便无法从任何缓存或非易失性介质中恢复先前的用户数据。

1.6.36 辅助控制器

NVM Express 控制器,依赖于 NVM 子系统中的主控制器来管理某些控制器资源(请参阅第 8.5 节)。支持 NVM Express 接口并从主控制器接收资源的 PCI Express SR-IOV 虚拟功能是辅助控制器的一个示例(请参阅第 8.5.4 节)。

1.6.37 共享命名空间

可以同时连接到 NVM 子系统中的两个或多个控制器的命名空间。主机可以通过 Identify Namespace 数据结构中 Namespace 多路径 I/O 和 Namespace 共享功能 (NMIC) 字段的值来确定命名空间是私有命名空间还是共享命名空间。

1.6.38 用户数据

存储在命名空间中的数据,由主机可能存储和稍后检索的数据组成,包括元数据(如果支持)。

1.7 关键词

几个关键词用于区分不同级别的需求。

1.7.1 必填项

一个关键字,指示本规范定义的要实现的项目。

1.7.2 may

表示选择灵活性的关键字,没有暗示的偏好。

1.7.3 可选

描述本规范不需要的功能的关键字。但是,如果实现了规范定义的任何可选功能,则应按照规范定义的方式实现该功能。

1.7.4R

当图或表没有为完整的“保留”一词提供足够的空间时,“R”用作“保留”的缩写。

1.7.5 保留

一个关键字,指的是为将来标准化而预留的位、字节、字、字段和操作码值。它们的使用和解释可能会由本规范或其他规范的未来扩展来指定。保留的位、字节、字、字段或寄存器应清除到 0h,或根据本规范的未来扩展。命令或寄存器写入的接收者不需要检查保留的位、字节、字或字段。在命令中的定义字段中接收到保留的编码值应作为错误报告。将保留的编码值写入控制器寄存器字段会产生未定义的结果。

1.7.6 shall

表示强制性要求的关键字。设计人员必须实施所有这些强制性要求,以确保与符合规范的其他产品的互操作性。

1.7.7 should

表示选择灵活性的关键词,以及强烈偏好的备选方案。相当于短语“建议”。

1.8 byte、word和 dword 的关系

图 8 说明了字节、word和 dword之间的关系。qword(4word)是数据单位,大小是word的四倍;由于篇幅所限,没有对此进行说明。除非另有说明,否则本规范以小端格式指定数据。

图 8:Byte、Word 和 Dword 关系

  • 17
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值