【NVMe】NVMe1.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 Na
mespace数据结构指⽰特定于特定命名空间的功能和设置。 通⽤的命名空间功能和设置由名称空间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映射。
提交队列(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,也不⽀持名称空间共享。
图4展⽰了⼀个多Function 的NVM⼦系统,其中包含⼀个PCI Express端⼝和两个控制器,⼀个控制器与PCI功能0相关联,另⼀个控制器与PCI功能1相关联。每个控制器⽀持单个专⽤的命名空间并访问共享命名空间B。所有控制器可访问的指定共享命名空间的ID应相同。在这个例⼦中,两个控制器使⽤命名空间ID 2来访问共享名称空间。
每个控制器都有⼀个唯⼀的Identify Controller数据结构,同时每个命名空间都有唯⼀的Identify Namespace数据结构。不同的控制器访问共享命名空间会返回与该共享命名空间相关联的Identify Namespace数据结构(即,所有可访问同⼀共享命名空间的控制器返回相同的数据结构内容)。每个命名空间都会有⼀个与⾃⾝相关联的全局唯⼀标识符,并且可以⽤于确定多路径下的共享命名空间。请参阅第7.10节。
与共享命名空间相关联的多个控制器可以同时在该命名空间上操作。各个控制器执⾏该命名空间的写操作时,需要是原⼦写的(参见第6.4节)。在共享命名空间的控制器之间,写⼊原⼦性级别不需要相同。如果访问共享命名空间的不同控制器的命令之间存在任何排序要求,则需要主机软件或相关应⽤程序来强制执⾏这些排序要求。
图5显⽰了⼀个带有两个PCI Express端⼝的NVM⼦系统,每个端⼝都有⼀个相关的控制器。两个控制器都映射到相应端⼝的PCI功能0。此⽰例中的每个PCI Express端⼝都是完全独⽴的,并具有⾃⼰的PCI Express基本复位和参考时钟输⼊。重置端⼝只会影响与该端⼝关联的控制器,并且不会影响其他控制器,共享命名空间或共享命名空间上其他控制器执⾏的操作都不会受到影响。此⽰例的功能⾏为与图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节。
本节中提供的⽰例旨在说明概念,⽽不是为了枚举所有可能的配置。例如,NVM⼦系统可以包含多个PCI Express端⼝,每个端⼝⽀持SR-IOV。
1.5 约定
对于标记为保留的所有位和寄存器,硬件应返回’0’,主机软件写⼊时也应为’0’。
在寄存器部分(即第2部分和第3部分)中,使⽤以下术语和缩写:
RO 只读
RW 可读写
controller翻译中文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”⼩写。