NVM Express®(NVMe®)基本规范定义了主机软件通过各种基于内存的传输和基于消息的传输与非易失性存储器子系统通信的接口。
本文档定义了一个特定的NVMe I/O命令集,即分区命名空间命令集,它扩展了NVMe基本规范和NVM命令集规范。
图1显示了NVM Express®分区命名空间命令集规范与NVMe规范系列中其他规范的关系
本规范是对NVMe基本规范的补充。本规范定义了其他数据结构、功能、日志页、命令和状态值。本规范还定义了对现有数据结构、功能、日志页、命令和状态值的扩展。本规范定义了特定于分区命名空间命令集的要求和行为。NVMe基本规范中定义了一般适用于NVMe或适用于多个I/O命令集的功能。
如果在不同规范中定义的要求之间出现冲突,则下表中编号较低的规范应优先于编号较高的规范:
1.非NVMe规范
2.NVMe基本规范
3.NVMe传输规范
4.NVMe I/O命令集规范
5.NVMe-MI规范
本规范符合NVMe基本规范的约定部分、关键字部分以及字节、字和双字关系部分。
本规范使用NVMe基本规范中的定义
本规范和NVMe基本规范中使用的以下术语在此处定义。
- Endurance Group Host Read Command:在NVM命令集规范中定义
- Format Index:用于索引LBA格式数据结构、扩展LBA格式数据结构和LBA格式扩展数据结构的值。
- SMART Data Units Read Command:在NVM命令集规范中定义
- SMART Host Read Command:在NVM命令集规范中定义
- User Data Out Command:在NVM命令集规范和zone append命令中定义
以下术语在NVM命令集规范中定义,并在本规范中使用:
a) LBA range
b) logical block
c) logical block address (LBA)
d) User Data Format
本节定义了特定于本规范的术语。
- active zone:处于ZSIO:隐式打开状态、ZSEO:显式打开状态或ZSC:关闭状态的区域。
- Address-Specific Write Command :写入命令、写入不可更正命令、写入零命令或复制命令。特定于地址的写命令在命令参数中指定一系列逻辑块地址,作为提交队列条目的一部分,或者在命令参数所指向的数据结构中。
- open zone:处于ZSIO:隐式打开状态或ZSEO:显式打开状态的区域。
- write operation:由写命令、写零命令、写不可纠正命令、复制命令或区域附加命令启动的操作。
- zone:作为单个单元管理的一系列连续的逻辑块地址。
- Zone Descriptor:包含有关zone信息的数据结构。
- Zone Descriptor Extension:与zone关联的主机定义的数据。
- zoned namespace:划分为zone并与zns命令集相关联的命名空间。
略
NVMe基本规范定义了主机软件与非易失性存储器子系统通信的接口。本规范定义了分区命名空间命令集的附加功能。
此命令集的命令集标识符(CSI)值为02H。
本部分定义zns命令集的操作。
命名空间是NVM的集合,并在本规范修改的NVMe基本规范和NVM命令集规范中定义。
zns是与zns命令集相关联的命名空间。一个分区命名空间(zoned namespace)被划分为一组大小相等的zones,这些zone是逻辑块地址的连续非重叠范围。图2显示了具有x个zone和z个LBA的分区命名空间,其中LBA 0是zone 0的最低LBA,LBA z-1是zone x-1的最高LBA,而对于zone 1,m是最低LBA,n-1是其最高LBA。
zns命令集基于NVM命令集(请参阅NVM命令集规范)。每个zone都有一个关联的区域描述符(Zone Descriptor),其中包含一组属性。区域管理接收命令(Zone Management Receive command)可用于检索一个或多个区域描述符(Zone Descriptor)。
2.1.1.1 Zone Descriptor
图3总结了与区域相关联的属性。这些属性在图37中定义的区域描述符数据结构中报告。
- zone type:定义读取和写入zone的规则。
- zone state:每个区域都有一个关联的状态机。该状态机具有一组状态,每个状态与zone type一起定义该区域的操作特征。
- Write Pointer:写指针属性定义该区域中的下一个可写逻辑块地址。写指针的有效性是zone state特定的,并按zone type定义(参见第2.1.1.2节)。
- 分区开始逻辑块地址:区域起始逻辑块地址(ZSLBA)属性定义该区域的最低逻辑块地址。
- Zone Capacity:分区容量属性定义该分区的可写容量。
- Zone Descriptor Extension Valid:区域描述符扩展有效属性定义该区域的区域描述符扩展数据的有效性。请参阅第5.3节。
- Reset Zone Recommended:表示控制器建议主机重置该区域。请参阅第5.4节。
- Finish Zone Recommended:指示控制器建议主机finish该区域。请参阅第5.5节。
- Zone Finished by Controller:指示控制器由于区域活动偏移(Zone Active Excursion)而finish了该区域。请参阅第5.6节。
2.1.1.2 zone types
2.1.1.2.1 Sequential Write Required Zones
Sequential Write Required的区域类型需要按顺序写入区域的一组逻辑块地址。
2.1.1.2.1.1 Writing in Sequential Write Required Zones(在需顺序写入区域中写入)
以下命令可用于写入特定区域类型的需要顺序写入的逻辑块:
Write command;
Write Zeroes command;
Write Uncorrectable command;
Copy command; and
Zone Append command.
为分区的命名空间中的每个区维护指示该区中的下一个可写逻辑块地址的写指针。写指针对于图4中定义的区域状态的子集有效。
主机可以使用区域管理接收命令(Zone Management Receive command)来确定区域的当前写指针。
处于ZSE:EMPTY状态、ZSIO:IMPLICIT OPEN状态、ZSEO:EXPLICIT OPEN状态或ZSC:CLOSED状态的区域的写入指针应增加成功完成写入操作时写入的逻辑块数。
如果控制器不能成功写入启动写入操作的命令指定的所有逻辑块,则写入指针应:
A)设置为该命令中指定的LBA范围内的值;
b)设置为比该命令中指定的LBA范围内的最后一个LBA大1;或
c)变为无效(即,由于转换到ZSRO:Read Only状态或ZSO:Offline状态,或由于区域活动偏移(Zone Active Excursion)(参见第5.6节))。
区域发送操作为重置区域的区域管理发送命令(Zone Management Send command)将写入指针设置为该区域的ZSLBA。
图5显示了zse:Empty状态下的区域示例。LBA m是ZSLBA属性,写指针指示ZSLBA,n-1是区域的最高LBA。
图6显示了一个区域的示例,该区域处于ZSIO:Implative OPEN状态、ZSEO:EXPLICIT OPEN状态或ZSC:CLOSED状态,其中写入了一些逻辑块。由LBA w指示的写指针是编号最低的未写入LBA(即,要写入的下一个LBA),而n-1是该区域的最高LBA。
控制器应中止写入处于ZSF:FULL状态且状态代码为Zone IS FULL的区域的命令。
控制器应中止写入处于ZSRO:Read Only状态,状态代码为Zone is Read Only的区域的命令。
控制器应中止写入处于ZSO:offline状态,状态代码为zone is offline的区域的命令。
对于处于ZSE:EMPTY状态、ZSIO:隐式打开状态、ZSEO:显式打开状态或ZSC:关闭状态的区域:
a) 如果地址特定的写入命令( Address-Specific Write Command)指定的起始LBA字段不等于该区域的写入指针,则控制器应中止该命令,同时状态代码为zone invalid write;以及
b) 如果区域附加命令( Address-Specific Write Command)指定的ZSLBA不是该区域中的最低逻辑块地址,则控制器应中止该命令,同时状态代码为invalid field。
控制器应中止启动写入操作的命令,该写入操作在一个区域中具有起始LBA,并且其逻辑块数量超过该区域中剩余的逻辑块数量,状态代码为区域边界错误(Zone Boundary Error)。
2.1.1.2.1.2 Reading in Sequential Write Required Zones
如果用户数据读取访问命令(User Data Read Access Command)的区域为:
a) 在ZSO:Offline状态下,则应中止该命令,状态代码为Zone is Offline;或
b)在任何其他状态下,则执行该用户数据读取访问命令(User Data Read Access Command),如本节,第2.1.1.5节以及NVM命令集规范中已释放或未写入的逻辑块(Deallocated or Unwritten Logical Blocks)部分中所述。
如果在分区命名空间命令集特定标识命名空间数据结构(参见图48)中将跨区域边界读取(Read Across Zone Boundaries)比特位设置为‘1’,则允许用户数据读取访问命令(User Data Read Access Command)指定包含多个区域中的逻辑块的LBA范围。
如果跨区域边界读取位被清除为‘0’,则执行指定包含多个区域中的逻辑块的LBA范围的读取操作的命令将被中止,状态代码为区域边界错误(zone boundary error)。
2.1.1.3 Zone State Machine
每个区域都有一个与之关联的状态机。状态机控制每个区域的运行特性。状态机由以下状态组成:ZSE:空、ZSIO:隐式打开、ZSEO:显式打开、ZSC:已关闭、ZSF:已满、ZSRO:只读和ZSO:脱机。
区域状态机的初始状态设置为以下结果:
a) NVM子系统重置;或
b) NVM子系统中的所有控制器报告控制器关机处理完成(即,关机类型(ST)位清零,关机状态(SHST)字段设置为10b,参见NVMe基本规范)。
每个分区的初始状态为:
a) ZSE:空状态,如果写指针有效,则写指针指向区中的最低LBA,并且区描述符扩展有效位被清零(为啥要特别强调这句话?);
b) ZSC:关闭状态:
a)如果写指针有效并且没有指向区中的最低LBA;或者
b)如果写指针有效并且区描述符扩展有效位被设置为1;
c)ZSF:满状态:
a)如果最近的状态是ZSF:Full;或者
b)如果区域状态作为NVM子系统重置的结果被转换到ZSF:FULL状态;
d)ZSRO:只读状态,如果最近的区域状态是ZSRO:只读状态;以及
e)ZSO:离线状态,如果最近的区域状态是ZSO:离线状态。
区域状态之间的转换导致报告区域描述符更改(Zone Descriptor Changed)的异步事件,如图42中所定义。
如果分区命名空间使用FORMAT NVM命令格式化或使用命名空间管理命令(Namespace
Management command)创建,则分区命名空间中的分区将初始化为ZSE:EMPTY状态或ZSO:OFFLINE状态。
处于ZSE:EMPTY状态、ZSIO:隐式打开状态、ZSEO:显式打开状态、ZSC:关闭状态或ZSF:FULL状态的区域可以通过本说明书范围之外的机制(???)转换到ZSRO:只读状态或ZSO:脱机状态。
图7显示了从格式化或创建分区命名空间开始,每个分区状态之间的有效转换。从ZSE:EMPTY状态到ZSC:CLOSED状态的转换(虚线)仅在分区的命名空间使用区域描述符扩展(Zone Descriptor Extension)支持进行格式化时才有效(参见第5.3节)。指向或离开阴影区域的箭头表示向该区域中的所有状态转换或从该区域中的所有状态转换。
命令的处理可引起多个状态机转换(例如,写命令的处理可导致从ZSC:关闭状态到ZSIO:隐式打开状态的转换,然后导致从ZSIO:隐式打开状态到ZSF:FULL状态的转换)。
2.1.1.3.1 ZSE:Empty state
转换ZSE:ZSIO:如果存在2.1.1.4节中定义的可用资源,并且写入操作写入该区域的一个或多个逻辑块,则该区域将从ZSE:EMPTY状态转换到ZSIO:隐式打开状态。
转换ZSE:ZSEO:如果有2.1.1.4节中定义的可用资源,并且带有打开区域的区域发送操作的区域管理发送命令(Zone Management Send command)成功完成,则区域将从ZSE:EMPTY状态转换到ZSEO:显式打开状态。
转换ZSE:ZSC:如果存在2.1.1.4节中定义的可用活动资源,并且带有设置区域描述符扩展(Set Zone Descriptor Extension)的区域发送操作(Zone Send Action)的区域管理发送命令(Zone Management Send command)成功完成,则区域将从ZSE:EMPTY状态转换到ZSC:CLOSED状态。
转换ZSE:ZSF:区域将从ZSE:EMPTY状态转换到ZSF:FULL状态,这是带有finish zone的区域发送操作(Zone Send Action)的区域管理发送命令(Zone Management Send command)成功完成的结果。
2.1.1.3.2 ZSIO:Implicitly Opened state
转换ZSIO:ZSE:区域将从ZSIO:隐式打开状态转换到ZSE:EMPTY状态,这是带有重置区域(reset zone)的区域发送操作的区域管理发送命令成功完成的结果。
转换ZSIO:ZSEO:区域将从ZSIO:隐式打开状态转换到ZSEO:显式打开状态,这是成功完成带有打开区域(open zone)的区域发送操作的区域管理发送命令的结果。
转换ZSIO:ZSC:由于以下原因,区域将从ZSIO:隐式打开状态转换到ZSC:关闭状态:
a)成功完成带有关闭区域(close zone)的区域发送操作的区域管理发送命令;以及
b)控制器启动第2.1.1.4.1节中定义的转换。
转换ZSIO:ZSF:该区域将从ZSIO:隐式打开状态转换到ZSF:FULL状态:
a)由于成功完成了具有Finish Zone的区域发送操作的区域管理发送命令;
b)由于写入一个或多个逻辑块的写操作导致区域达到其可写区域容量;
c)由于区域活动偏移(Zone Active Excursion )(参见第5.6节);以及
d)由于分区的命名空间变为写保护(参见NVME基本规范中的命名空间写入保护(Namespace Write Protection)部分)。
2.1.1.3.3 ZSEO:Explicitly Opened state
转换ZSEO:ZSE:区域将从ZSEO:EXPLICIT OPEN状态转换到ZSE:EMPTY状态,这是带有重置区域(reset zone)的区域发送操作的区域管理发送命令成功完成的结果。
转换ZSEO:ZSC:在成功完成带有关闭区域(close zone)的区域发送操作的区域管理发送命令后,区域将从ZSEO:显式打开状态转换到ZSC:关闭状态。
转换ZSEO:ZSF:该区域将从ZSEO:显式打开状态转换到ZSF:FULL状态:
a)由于成功完成了具有Finish zone的区域发送操作的区域管理发送命令;
b)由于写入一个或多个逻辑块的写操作导致区域达到其可写区域容量;
c)由于区域活动偏移(参见第5.6节);或
d)由于分区的命名空间变为写保护(参见NVME基本规范中的命名空间写入保护(Namespace Write Protection)部分)。
2.1.1.3.4 ZSC:Closed state
转换ZSC:ZSE:区域将从ZSC:Closed状态转换到ZSE:Empty状态,这是成功完成带有重置区域(reset zone)的区域发送操作的区域管理发送命令的结果。
转换ZSC:ZSIO:如果存在2.1.1.4节中定义的可用资源,并且写入操作写入该区域的一个或多个逻辑块,则该区域应从ZSC:Closed状态转换为ZSIO:Implative Open状态。
转换ZSC:ZSEO:如果有2.1.1.4节中定义的可用资源,并且带有打开区域(open zone)的区域发送操作的区域管理发送命令成功完成,则区域应从ZSC:关闭状态转换到ZSEO:显式打开状态。
转换ZSC:ZSF:区域将从ZSC:Closed状态转换到ZSF:Full状态:
a)由于成功完成了带有Finish zone的区域发送操作的区域管理发送命令;
b)由于区域活动偏移(Zone Active Excursion)(参见第5.6节);以及
c)由于分区的命名空间变为写保护(参见NVMe基本规范中的命名空间写保护部分)。
2.1.1.3.5 ZSF:Full state
转换ZSF:ZSE:区域将从ZSF:FULL状态转换到ZSE:EMPTY状态,这是成功完成带有reset zone的区域发送操作的区域管理发送命令的结果。
2.1.1.3.6 ZSRO:Read Only state
转换ZSRO:ZSO:区域将从ZSRO:Read Only状态转换为ZSO:Offline状态,这是成功完成带有offline zone的区域发送操作的区域管理发送命令的结果。
2.1.1.3.7 ZSO:Offline state
不存在从ZSO:Offline状态到任何其他区域状态的转换。
2.1.1.4 Zone Resources
区域可能具有关联的活动资源和关联的开放资源。资源限制了允许处于每个区域状态的区域的数量。资源关系在图8中定义。
具有关联Open Resources的区域是与Active Resources关联的区域的子集。最大开放资源(Open Resources)字段应小于或等于分区名称空间命令集的I/O命令集特定标识名称空间数据结构中的最大活动资源字段(Maximum Active Resources field )(参见图48)。
2.1.1.4.1 (p14)