NVM Subsystem
- 3.2NVM子系统实体
- 3.2.1命名空间
- 3.2.1.1命名空间概述
- 3.2.1.2Valid and Invalid NSIDs
- 3.2.1.3Allocated and Unallocated NSID Types
- 3.2.1.4Active and Inactive NSID Types
- 3.2.1.5NSID and Namespace Relationships
- 3.2.1.7I/O Command Set Associations
- 3.2.2NVM Sets
- 3.2.3Endurance Groups
- 3.2.3.1配置和管理 Endurance Group Events
- 3.2.4域和分区(Domains and Divisions)
- 3.2.4.1概述
- 3.2.4.2Domains and Reservations
- 3.2.4.3Domain Identifier 的使用(资料)
3.2NVM子系统实体
3.2.1命名空间
3.2.1.1命名空间概述
命名空间(namespace)是可以被主机直接访问的格式化数量的非易失性内存。namespace ID (NSID) 是控制器用来提供对命名空间的访问的标识符。
3.2.1.2Valid and Invalid NSIDs
Valid NSID 是可能的 NSID 范围,可用于引用 NVM 子系统中存在的命名空间。任何 NSID 都是有效的,除非该 NSID 为 0h 或大于 Identify Controller data structure 中报告的 Number of Namespaces 字段(参见Figure 275)。NSID FFFFFFFFh 是一个广播值,用于指定所有命名空间。invalid NSID 是指不是valid NSID 且也不是广播值的值。
有效的 NSID 是:
a) 在 NVM 子系统中allocated或unallocated;和
b) 特定控制器的inactive或active。
3.2.1.3Allocated and Unallocated NSID Types
在NVM子系统中,一个valid NSID是:
a)一个allocated NSID; 或
b)一个 unallocated NSID.
Allocated NSID 是引用了 NVM 子系统中存在的命名空间。Unallocated NSID 不引用 NVM 子系统中存在的任何命名空间。
3.2.1.4Active and Inactive NSID Types
对于特定的控制器,一个allocated NSID 是:
a)一个active NSID; 或
b)一个 inactive NSID.
控制器的active NSID 指的是附加到该控制器的命名空间。Allocate给控制器的inactive NSID 指的是未附加到该控制器的命名空间。
Unallocated NSID 是 NVM 子系统中所有控制器的inactive NSID。
如果 NSID 所指的命名空间附加到 NVM 子系统中的某些控制器,但不是所有控制器,则allocated NSID 可能是某些控制器的 active NSID 和同一 NVM 子系统中的其他控制器的inactive NSID。
有关与被分离或删除的命名空间相关的操作,请参阅第 8.11 节。
3.2.1.5NSID and Namespace Relationships
除非另有说明,在使用Namespace Identifier (NSID) 字段的命令中指定inactive NSID 将导致控制器以 Invalid Field in Command 状态代码中止命令。在使用 NSID 字段的命令中指定invalid NSID 将导致控制器以 Invalid Namespace or Format 状态码中止命令。
下表总结了valid NSID 类型,Figure 70 直观地显示了 NSID 类型以及它们之间的关系。
Valid NSID Type | NSID relationship to namespace | Reference |
---|---|---|
Unallocated | 不引用 NVM 子系统中存在的任何命名空间 | 3.2.1.3 |
allocated | 引用存在于 NVM 子系统中的命名空间 | 3.2.1.3 |
Inactive | 不引用附加到控制器的命名空间1 | 3.2.1.4 |
active | 引用附加到控制器的命名空间 | 3.2.1.4 |
NOTES: 如果allocated,则指未附加到控制器的命名空间。如果unallocated,则不引用任何命名空间。 |
如果支持Namespace Management(请参阅第 8.11 节)、ANA Reporting(请参阅第 8.1 节)或NVM Sets(请参阅第 3.2 节)capabilities,则 NSID 在 NVM 子系统中应是唯一的(例如,NSID 3,无论控制器如何,都应访问相同的物理命名空间)。如果不支持Namespace Management、ANA Reporting和 NVM Sets capabilities,则 NSID:
a)对于共享命名空间应是唯一的;
b)私有命名空间不需要是唯一的。
Identify 命令(参见第 5.17 节)可用于确定控制器的active NSID 和 NVM 子系统中的allocated NSID。
如果 MNAN 字段(参见Figure 275)被清除为 0h,则allocated NSID 的最大数量与 NN 字段中报告的值相同(参见Figure 275)。如果 MNAN 字段不为0,则allocated NSID 的最大数量可能小于命名空间的数量(例如,NVM 子系统可能支持设置为 1,000,000 的最大valid NSID 值(即 NN 字段)但最多支持allocated 10 个 NSID 值)。
要确定特定控制器的active NSID,主机可以采用以下任一方法:
- 发出一个Identify命令,并将每个valid NSID 的 CNS 字段清除为 0h(基于Identify Controller data structure 中的Number of Namespaces值(即,MNAM 字段或 NN 字段))。如果为特定 NSID 返回非0数据结构,则该 NSID 为active NSID;要么
- 发出一个将 CNS 字段设置为 2h 的Identify命令,以检索多达 1,024 个active NSID 的清单。如果有超过 1,024 个active NSID,则继续发出Identify命令并将 CNS 字段设置为 2h,直到检索到所有active NSID。
为了确定 NVM 子系统中allocated NSID,主机可以发出一个Identify命令,其中 CNS 字段设置为 10h,以检索多达 1,024 个allocated NSID 的清单。如果allocated NSID 超过 1,024 个,则继续发出Identify命令并将 CNS 字段设置为 10h,直到检索到所有allocated NSID。
Namespace ID 可能会在断电条件下发生变化。但是,建议Namespace ID 在断电条件下保持静态,以避免主机软件出现问题。要确定是否遇到了相同的命名空间,主机可以使用:
a) Namespace Identification Descriptor中的 UUID 字段(参见Figure 277)(如果存在);
b) Identify Namespace data(参考适用的 I/O Command Set 规范)或 Namespace Identification Descriptor 中的 NGUID 字段(如果存在);要么
c) Identify Namespace data 或 Namespace Identification Descriptor 中的 EUI64 字段(如果存在)。
NSFEAT 字段中的 UIDREUSE 位(请参阅Figure 280 或 NVM Command Set Specification 中的Identify Namespace data structure,如果适用)指示 NGUID 和 EUI64 重用特性。
如果支持 Asymmetric Namespace Access Reporting(即,在 Identify Controller data structure 的 CMIC 字段中将第 3 位设置为“1”(参见Figure 275)),请参阅适用的 I/O Command Set 规范以获取更多详细信息。
命名空间可能与 Submission Queue 有关系,也可能没有关系;这种关系由主机软件实现决定。控制器应支持从任何 I/O Submission Queue 访问任何 active namespace。
3.2.1.7I/O Command Set Associations
一个命名空间只与一个 I/O Command Set 相关联。对于 I/O 命令和 I/O Command Set特定的Admin命令,与提交队列条目关联的 I/O Command Set 由命令中的 Namespace Identifier(NSID) 字段确定。 NVM 子系统可能包含命名空间,每个命名空间都与不同的 I/O Command Set 相关联。控制器可以支持附加的命名空间,这些命名空间使用控制器同时支持的任何 I/O Command Set,如 I/O Command Set Profile 文件中所示(请参阅第 5.27.1.21 节)。
3.2.2NVM Sets
NVM Set是 NVM 的集合,与其他 NVM Set 中的 NVM 分开(逻辑上和潜在物理上)。一个或多个命名空间可以在 NVM Set 中创建,这些命名空间继承 NVM Set 的属性。命名空间完全包含在单个 NVM Set 中,并且不得跨越多个 NVM Set。
Figure 72 显示了三个 NVM Set 的示例。NVM Set A 包含三个命名空间(NS A1、NS A2 和 NS A3)。NVM Set B 包含两个命名空间(NS B1 和 NS B2)。NVM Set C 包含一个命名空间 (NS C1)。显示的每个 NVM Set还包含“Unallocated”区域,这些区域由尚未分配给命名空间的 NVM Set成。
有一个 NVM Set aware Admin 命令子集,如Figure 73 中所述。
主机使用Identify命令确定存在的 NVM Sets 及其属性,CNS 值为 04h 以检索 NVM Set List(参见Figure 278)。对于每个 NVM Set,属性包括:
-
与 NVM Set 关联的标识符;
-
写入 NVM Set 的最佳大小;
-
NVM Set 的总容量;和
-
NVM Set 的未分配容量。
NVM Set Identifier是一个 16 位值,用于指定与操作关联的 NVM Set。NVM Set Identifier可以在 NVM Set aware Admin命令中指定(参见Figure 73)。NVM Set Identifier 0h 被保留,它不是有效的 NVM Set Identifier。除非另有规定,如果主机为需要 NVM Set Identifier的命令指定 NVM Set Identifier清除为 0h,则该命令应以 Invalid Field in Command 状态码中止。
每个 NVM Set都与一个 Endurance Group 相关联(请参阅第 3.2.3 节)。
命名空间关联的 NVM Set 在 Identify Namespace data structure 中报告(请参阅适用的 NVMe I/O Command Set 规范)。当主机使用 Namespace Management 命令创建命名空间时,主机指定要在其中创建命名空间的 NVM Set 的 NVM Set Identifier。创建的命名空间从 NVM Set 继承属性(例如,写入到 NVM最佳大小)。
如果支持 NVM Set,则 NVM 子系统中的所有控制器应: - For each NVM Set, indicate the associated Endurance Group as an attribute.
-
在 Identify Controller data structure 的 Controller Attributes 字段中指明对 NVM Set 的支持;
-
在所有使用 NVM Set Identifier 的命令中支持 NVM Set Identifier;
-
支持Identify命令的NVM Set List;
-
在Identify Namespace data structure 中指明命名空间所关联的NVM Set Identifier;
-
支持 Endurance Groups;
-
对于每个 NVM Set,将关联的 Endurance Group 指示为一个属性。
如果未报告对 NVM Sets 的支持(即,CTRATT 字段中的 NVM Set 位被清除为“0”;请参阅Figure 275),则 NVM Set Identifier 字段应在所有支持 NVM Set Identifier字段的命令和数据结构中被清除为 0h。
3.2.3Endurance Groups
Endurance 可以在单个 NVM Set (参见第 3.2.2 节)或跨 NVM Set 的集合中进行管理。每个 NVM Set 都与一个 Endurance Group 相关联(参见Figure 278)。如果两个或更多 NVM Sets 具有相同的 Endurance Group Identifier,则Endurance由 NVM 子系统跨该 NVM Set 集合管理。如果只有一个 NVM Set 与特定的 Endurance Group Identifier 相关联,则 Endurance 在本地 NVM Set 管理。一个 Endurance Group 只能是一个域的一部分(参见第 3.2.4 节)。
Endurance Group Identifier 是一个 16 位的值,用于指定与操作相关联的 Endurance Group。Endurance Group Identifier 值 0h 是保留的,不是有效的 Endurance Group Identifier。除非另有规定,如果主机为需要 Endurance Group Identifier 的命令指定 Endurance Group Identifier 为 0h,则该命令应以 Invalid Field in Command 状态码中止。
描述 Endurance Group 的信息显示在 Endurance Group Information log page中(请参阅第 5.16.1.10 节)。
Figure 74 显示了添加到Figure 72 示例的 Endurance Group。在此示例中,NVM Set A 和 NVM Set B 的 Endurance 作为 Endurance Group Y 的一部分一起管理,而 NVM Set C 的 Endurance 仅在 NVM Set 内进行管理C, 它是唯一属于 Endurance Group Z 的 NVM Set。
如果支持 Endurance Groups,则 NVM 子系统和所有控制器应:
-
在 Identify Controller data structure 的 Controller Attributes 字段中指示对 Endurance Groups 的支持;
-
在 Identify Namespace data structure 中指明与命名空间相关联的Endurance Group Identifier;
-
支持 Endurance Group Information log page。
-
支持 Endurance Group Event Aggregate log page
如果不支持 Endurance Groups 并且主机发送其中定义了 Endurance Group Identifier 字段的命令(例如,Get Log Page),则控制器应该忽略该字段。
如果不支持 Endurance Groups 并且控制器向主机返回包含 Endurance Group Identifier 字段的信息,则该字段应清除为 0h。
3.2.3.1配置和管理 Endurance Group Events
主机可以配置异步事件以在 Endurance Group 发生某些事件时触发。主机提交一个 Set Features 命令,指定 Endurance Group Event Configuration feature(请参阅第 5.27.1.20 节)、Endurance Group 以及应触发将条目添加到 Endurance Group Event Aggregate log page 的特定事件(请参阅第 5.16.1.15 节)。
主机使用 Set Features 命令为每个 Endurance Group 配置事件。
主机提交指定 Asynchronous Event Configuration feature 的 Set Features 命令(请参阅第 5.27.1.8 节),其中 Endurance Group Event Aggregate Log Change Notices 位设置为“1”,以指定如果将条目添加到 Endurance Group Event Aggregate log page 应向主机触发 Endurance Group Event Aggregate Log Page Change Notice 事件(参见Figure 353)。
主机通过读 Endurance Group Event Aggregate log page来确定有未完成事件的 Endurance Group。为每个具有未完成事件的 Endurance Group 返回一个条目。主机可以使用在 Identify Controller data structure 中报告的 Endurance Group Identifier Maximum 值来确定此日志页的最大大小。 为了确定报告的 Endurance Group 发生的特定事件,主机读取该 Endurance Group 的 Endurance Group Information log page(参见图 217)。Critical Warning字段指示已发生的事件(例如,Endurance Group 中的所有命名空间都已置于只读模式)。如果控制器成功处理了对该 Endurance Group 的 Endurance Group Information log page的读取,则该 Endurance Group 的所有事件都将被清除,其中 Get Log Page 命令将 Retain Asynchronous Event 位清除为“0”。如果 Endurance Group Information log page 中的 Critical Warning 字段被清除为 0h,则 Endurance Group Event Aggregate log page 中不会报告该 Endurance Group 的事件。
3.2.4域和分区(Domains and Divisions)
3.2.4.1概述
NVM 子系统可以由单个域或多个域(即两个或多个)组成。域是共享状态(例如power state、capacity信息)的最小不可分割单元。支持多个域的 NVM 子系统应支持Asymmetric Namespace Access Reporting(参见第 8.1 节)。
NVM 子系统的简单实现的一个常见示例是由单个域组成的(即不支持多个域)。
每个域都是独立的,域之间的边界就是通信边界(例如,故障边界、管理边界)。如果 NVM 子系统中存在多个域,则这些域在该 NVM 子系统的操作中协作。如果一个域无法在 NVM 子系统的运行中进行协作,则说明 NVM 子系统已经分区。
分区是 NVM 子系统中的一个事件(例如,域故障)或动作(例如,管理动作或重新配置),它影响 NVM 子系统中包含的域之间的通信(参见图 75 和图 76)。如果存在分区,则 NVM 子系统内的全局状态可能会受到影响(例如,控制器可能仅具控制器能够与之通信的域的状态的信息)。分区事件或行动可能:
-
影响对命名空间的访问(参见第 8.1 节);要么
-
具有 NVM子系统范围的影响操作(例如,TNVMCAP、sanitize、format、SMART信息)。
一个域包括:
-
0个或多个控制器;和
-
0个或多个 NVM Endurance Groups。
如果 NVM 子系统支持多个域,则该 NVM 子系统中的所有控制器应:
-
在 Identify Controller data structure 的 CTRATT 字段中将 MDS位设置为"1"(参见Figure 275);
-
将每个 Endurance Group descriptor中的Domain Identifier(如果支持)设置为非0值;和
-
将每个 Identify Controller data structure 中的 Domain Identifier 设置为非0值。
如果 NVM 子系统支持多个域,则该 NVM 子系统中的控制器可以:
- 支持 Endurance Groups(请参阅 Identify Controller data structure 的CTRATT 字段中的 Endurance Groups 位)。
对于支持多个域的 NVM 子系统,应为每个域分配一个在 NVM 子系统内唯一的domain identifier(参见Figure 275 中的 Domain Identifier 字段和第 3.2.4.3 节)。对于不支持多个域的 NVM 子系统,Domain Identifier字段被清除为 0h。
Figure 75 显示了一个包含三个域的 NVM 子系统示例。Domain 1 包含两个控制器和一定数量的 NVM 存储容量,这些容量已分配给两个私有命名空间(即 NS A 和 NS C)和一个共享命名空间(即 NS B)。Domain 2 包含两个控制器和一些已分配给两个共享命名空间(即 NS D 和 NS E)的 NVM 存储容量。Domain 3 包含一个控制器,并且没有 NVM 存储容量。
如果在Figure 75 所示的示例中,发生分区事件导致Domain 1 不再能够与Domain 2 和Domain 3 通信,则 NVM 子系统将由两部分组成。第一部分由Domain 1 组成,第二部分由Domain 2 和Domain 3 组成。
Figure 76 显示了一个 NVM 子系统示例,该子系统由六个域组成,其中三个是包含控制器的域。Domain 1 是一个包含两个控制器和一定数量的 NVM 存储容量的域,从中创建了 NVM Endurance Groups,其中包含一个私有命名空间(即 NS A)和一个共享命名空间(即 NS C)。Domain 2 是一个不包含控制器并包含一定数量的 NVM 存储容量的域,已从中创建了包含共享命名空间(即 NS B)的 NVM Endurance Groups。Domain 3 是包含两个控制器且没有 NVM 存储容量的域。Domain 4 是一个不包含控制器并包含一定数量的 NVM 存储容量的域,已从中创建了包含两个共享命名空间(即 NS D 和 NS E)的 NVM Endurance Groups。Domain 5 是包含一个控制器且没有 NVM 存储容量的域。Domain 6 是一个不包含控制器且没有分配给 NVM Endurance Group 的 NVM 存储容量的域(即,一个空域)。
3.2.4.2Domains and Reservations
如果 NVM 子系统支持多个域和Persistent Reservations(请参阅第 8.19 节),则在分区事件后恢复(例如,恢复操作,恢复通信)要求 NVM 子系统中域内的所有 persistent reservation 状态都不不再被划分被同步(即更新)。
如果命名空间的 reservation 状态未同步,则包含该命名空间的 ANA Group应转换为 ANA 不可访问状态(请参阅第 8.1.3.3 节)并保持该状态,直到 Persistent Reservation 同步。如果 Persistent Reservation 状态无法同步,则:
-
发生向 ANA Persistent Loss 状态的转换,并按照第 8.1.3.4 节所述处理命令;要么
-
控制器可能会停止处理命令并将Controller Fatal Status(CSTS.CFS) 位设置为"1"(请参阅第 9.5 节)。
3.2.4.3Domain Identifier 的使用(资料)
Domain Identifier值指示 NVM 子系统的组成域的部分。
主机可以使用这些值来确定哪些Endurance Groups(请参阅第 3.2.3 节)包含在同一域中,哪些包含在不同的域中。主机使用 domain identifier 的示例包括:
-
主机数据冗余软件(例如,RAID),可以使用 Endurance Group 的 Domain Identifier 来确定哪些 Endurance Groups 可能会一起失败(例如,同一域中的 Endurance Groups)以及哪些 Endurance Groups 可能独立失败(例如,不同的 Endurance Groups 域);和
-
主机应用程序软件可以使用控制器的 Domain Identifier 来确定哪些控制器共享域(例如,可能一起发生故障的控制器)以及哪些控制器是不同域的一部分(例如,可能独立发生故障的控制器)。