【NVMe】NVMe 1.3协议中文翻译——第一章简介

一、简介

1.1概述

NVMe协议(以前也叫NVMHCI)接口允许主机软件与非易失性存储器子系统通信。 此接口针对企业和客户端固态驱动器进行了优化,通常作为寄存器级接口连接到PCI Express接口。

1.1.1 NVMe over PCIE 和 NVMe over Fabrics

NVMe 1.3版本除了继承了老版本NVMe over PCIe,同时新增NVMe over Fabrics定义

1.2 范围

协议除了定义了如何与非易失性存储子系统的通信以外,还定义了NVMe子系统的命令集。

1.3 范围之外

协议没有规定存储子系统的具体存储介质以及具体的存储实现。

1.4 操作原理

NVMe协议是以PCIE协议为基础的可扩展性主机控制器接口,专为企业客户设计。接口提供命令提交和完成的交互手段,可支持高达65535条IO队列,每条队列支持64K条命令的并发操作。除此之外,提供许多企业级特性,如端到端保护、增强型错误上报以及虚拟化等。
协议主要特性有:
 在命令提交或完成中,不需要提供不可缓存或内存映射的寄存器读取;
 命令提交最多只需要一个MMIO的寄存器写;
 支持最高65535个IO队列,同时每个队列最高支持64K条命令;
 每条IO队列优先级可定义;
 完成一个4KB读请求需要64B的命令消耗;
 高效和简化的命令集;
 支持MSI/MSI-X的中断聚合;
 支持多命名空间;
 高效支持IO虚拟化架构如SR-IOV;
 强大的错误上报机制和管理能力;
 支持多路径IO以及命名空间共享;
该规范定义了一组简化的寄存器,其功能包括:
 定义了控制器功能;
 控制器故障状态(命令状态通过CQ直接处理);
 管理队列配置(通过Admin命令处理I / O队列配置);
 数量可扩展的提交和完成队列的Doorbell寄存器。
NVM Express控制器与单个PCI功能相关联,其中控制器功能(CAP)寄存器和识别控制器数据结构中表明了整个控制器的功能和设置。

命名空间是一定大小的非易失性存储空间,可以格式化为逻辑块。 NVM Express控制器可以通过命名空间ID支持多个命名空间。 可以使用命名空间管理和命名空间附加命令创建和删除命名空间。 Identify Namespace数据结构指示特定于特定命名空间的功能和设置。 通用的命名空间功能和设置由名称空间ID为FFFFFFFFh的Identify Namespace数据结构表示。
NVM Express接口基于成对的提交和完成队列机制。命令由主机软件放入提交队列。完成消息由控制器放入相关的完成队列中。 多个提交队列可以使用相同的完成队列。 提交和完成队列通过内存中分配。
Admin Submission Queue(管理提交队列)和对应的完成队列用于控制器管理和控制(例如,I/O提交和完成队列的创建和删除,中止命令等)。 只有属于Admin命令集的命令才可以提交给Admin Submission Queue。
I/O命令集与I/O队列对一起使用。 该规范定义了一个名为NVM命令集的I/O命令集。主机选择一个用于所有I/O队列对的I/O命令集。
主机软件创建队列,最高可达控制器支持的最大值。通常,创建的命令队列数基于系统配置和预期工作负载。例如,在基于四核处理器的系统上,每个核心可能有一个队列对以避免锁定并确保在适当的处理器核心缓存中创建数据结构。图1提供了队列对机制的图形表示,显示了提交队列和完成队列之间的1:1映射。

图2展示了多个I / O提交队列在Core B上使用相同的I / O完成队列。图1和图2展示了Admin Submission Queue和Admin Completion Queue之间始终存在1:1映射。
【NVMe】NVMe 1.3协议中文翻译——第一章简介_第1张图片
提交队列(SQ)是具有固定时隙大小的循环缓冲区,主机软件使用该缓冲区大小来提交命令以供控制器执行。 当有一到n个新命令要执行时,主机软件会更新相应的SQ Tail门铃寄存器。 当有新的门铃寄存器写入时,控制器中会覆盖先前的SQ Tail值。 控制器按顺序从提交队列中提取SQ条目,然后,它可以按任何顺序执行这些命令。
提交队列(SQ)是具有固定槽位大小的循环缓冲区,主机软件使用该缓冲区大小来提交命令以供控制器执行。 当有一到n个新命令要执行时,主机软件会更新相应的SQ Tail门铃寄存器。当有新的门铃寄存器写入时,控制器中会覆盖先前的SQ Tail值。控制器按顺序从提交队列中提取SQ条目,然后,它可以按任何顺序执行这些命令。
每个Submission Queue条目都是一个命令。命令大小为64字节。用于数据传输的内存以PRP形式或散列表形式来传输。 每个命令可以包括两个PRP条目或一个Scatter Gather List(SGL)段。 如果需要传输两个以上的PRP条目来描述数据缓冲区,则提供指向描述PRP条目列表的PRP列表指针。如果需要多个SGL段来描述数据缓冲区,则SGL段提供指向下一个SGL段的指针。
完成队列(CQ)是一个循环缓冲区,具有固定的插槽大小,用于发布已完成命令的状态。一个完成的命令通过关联的SQ标识符和由主机软件分配的命令标识符的组合唯一标识。多个提交队列可以与单个完成队列相关联。这个功能可以用在,当只有单个工作线程通过一个完成队列处理所有命令完成时,即使这些命令源自多个提交队列。
主机软件在处理完完成队列后会更新CQ头指针,表示当前队列的空闲CQ队列的槽位。在完成队列条目中定义了相位标记(P)位,以指示是否在未咨询寄存器的情况下新发布了条目。这使主机软件能够不通过查询寄存器的情况下确定该完成队列条目是新的还是未被更新。实际上,每使用完一轮完成队列的条目,控制器都会反转相位标记位。

1.4.1多路径I / O和命名空间共享

本节概述了多路径I / O和命名空间共享。 多路径I / O是指单个主机和命名空间之间具有两个或多个完全独立的PCI Express路径,而命名空间共享是指两个或多个主机使用不同的NVM Express控制器访问公共共享命名空间的能力。 多路径I / O和命名空间共享都要求NVM子系统包含两个或更多控制器。 两个或多个主机同时访问共享命名空间需要在主机之间进行某种形式的协调,至于如何协调这些主机的过程超出了本规范的范围。
图3显示了一个NVM子系统,它包含一个NVM Express控制器和一个PCI Express端口。 由于这是单个功能PCI Express设备,因此NVM Express控制器应与PCI Function 0相关联。控制器可支持多个命名空间。 图3中的控制器支持两个标记为NS A和NS B的命名空间。与至两个命名空间相关联的是分别为NSID 1和NSID 2的命名空间ID,控制器使用该名称空间ID来指定特定名称空间。 命名空间ID与命名空间本身不同,是主机和控制器用于在命令中指定特定命名空间的句柄。 控制器命名空间ID的定义超出了本规范的范围。 在此示例中,命名空间ID 1与命名空间A相关联,命名空间ID 2与命名空间B相关联。两个名称空间都是控制器专用的,并且此配置既不支持多路径I / O,也不支持名称空间共享。
【NVMe】NVMe 1.3协议中文翻译——第一章简介_第2张图片
图4展示了一个多Function 的NVM子系统,其中包含一个PCI Express端口和两个控制器,一个控制器与PCI功能0相关联,另一个控制器与PCI功能1相关联。每个控制器支持单个专用的命名空间并访问共享命名空间B。所有控制器可访问的指定共享命名空间的ID应相同。在这个例子中,两个控制器使用命名空间ID 2来访问共享名称空间。
【NVMe】NVMe 1.3协议中文翻译——第一章简介_第3张图片
每个控制器都有一个唯一的Identify Controller数据结构,同时每个命名空间都有唯一的Identify Namespace数据结构。不同的控制器访问共享命名空间会返回与该共享命名空间相关联的Identify Namespace数据结构(即,所有可访问同一共享命名空间的控制器返回相同的数据结构内容)。每个命名空间都会有一个与自身相关联的全局唯一标识符,并且可以用于确定多路径下的共享命名空间。请参阅第7.10节。
与共享命名空间相关联的多个控制器可以同时在该命名空间上操作。各个控制器执行该命名空间的写操作时,需要是原子写的(参见第6.4节)。在共享命名空间的控制器之间,写入原子性级别不需要相同。如果访问共享命名空间的不同控制器的命令之间存在任何排序要求,则需要主机软件或相关应用程序来强制执行这些排序要求。
图5显示了一个带有两个PCI Express端口的NVM子系统,每个端口都有一个相关的控制器。两个控制器都映射到相应端口的PCI功能0。此示例中的每个PCI Express端口都是完全独立的,并具有自己的PCI Express基本复位和参考时钟输入。重置端口只会影响与该端口关联的控制器,并且不会影响其他控制器,共享命名空间或共享命名空间上其他控制器执行的操作都不会受到影响。此示例的功能行为与图4中所示的相同。
【NVMe】NVMe 1.3协议中文翻译——第一章简介_第4张图片
图5中所示的两个端口可以与相同的Root Complex关联或不同的Root Complex关联,并且可以用于实现多路径I / O和I / O共享架构。系统级体系结构方面以及PCI Express结构中多个端口的使用超出了本规范的范围。
图6说明了支持单根I / O虚拟化(SR-IOV)的NVM子系统,它具有一个物理Function和四个虚拟Function。NVM Express控制器与每个Function关联,每个控制器具有私有命名空间,并且可以访问由所有控制器共享的命名空间,标记为NS F。此示例中控制器的行为与本节中其他示例的行为相似。有关SR-IOV的更多信息,请参见第8.5.4节。
【NVMe】NVMe 1.3协议中文翻译——第一章简介_第5张图片
本节中提供的示例旨在说明概念,而不是为了枚举所有可能的配置。例如,NVM子系统可以包含多个PCI Express端口,每个端口支持SR-IOV。

1.5 约定

对于标记为保留的所有位和寄存器,硬件应返回’0’,主机软件写入时也应为’0’。
在寄存器部分(即第2部分和第3部分)中,使用以下术语和缩写:
RO 只读
RW 可读写
R/W 可读写,读取的值可能不是写入的最后一个值。
RWC 读或写 ‘1’表示清除
Impl Spec 具体实现 - 控制器可以自由选择其实现。
HwInit 默认状态取决于NVM Express控制器和系统配置。该值在重置时初始化,例如通过扩展ROM,或者在集成设备的情况下,由平台BIOS初始化。
Reset 此列指示重置后字段的值
对于某些寄存器字段,是RW,RWC还是RO取决于具体实现;通常会显示为RW / RO或RWC / RO,表示如果不支持该功能,则该字段是只读的。
当在文档中引用寄存器字段时,使用的约定是“Register Symbol.Field Symbol”。例如,PCI命令寄存器奇偶校验错误响应启用字段由名称CMD.PEE表示。如果寄存器字段是位数组,则该字段称为“寄存器符号。字段符号(元素的数组偏移量)”。
数值计数从0开始,即数值0h表示第1h个数,因此数值0h表示第1h个数,数值1h表示第2h个数,数值2h表示第3h个数,以此类推。在该编号方案中,没有方法来表示第0h个数。除非另有说明,本说明书中的值是基于1的(即,数字1h表示1h的值,2h表示2h等)。
当文档中的大小以KB表示时,使用的约定是1KB = 1024字节。
^运算符用于表示要对数字,符号或表达式进行幂运算。
某些参数定义为ASCII码字符串。ASCII码字符串应仅包含20h到7Eh。 对于字符串“Copyright”,字符“C”是第一个字节,字符“o”是第二个字节,等等。字符串是左对齐的,如果需要,应在右边填充空格(ASCII字符20h)。 十六进制ASCII字符串是使用代码值子集的ASCII字符串:“0”到“9”,“A”到“F”大写,“a”到“f”小写。

你可能感兴趣的:(NVMe)