队列模型 - 📘 一、Common Command Format(通用命令格式) (第105页)
NVME2.0协议解读 1 min read

队列模型 - 📘 一、Common Command Format(通用命令格式) (第105页)

Blog Author

我们继续深入分析 NVM Express® Base Specification, revision 2.0b 第 94 页 的内容,重点讲解 Common Command FormatCommon Completion Queue Entry 的结构。这些内容是理解 NVMe 命令和响应队列的核心部分,涉及命令字段的详细定义以及如何在完成队列中传递命令执行结果。


📘 一、Common Command Format(通用命令格式)

命令数据结构:

Figure 87 描述了 Admin 命令和 NVM Vendor Specific 命令 的通用命令格式,其中包含了多个特定于命令的字段。具体结构如下:

字节范围(Bytes) 字段名 描述
03:00 Command Dword 0 (CDW0) 见前页 Figure 86,命令的核心信息字段
07:04 Namespace Identifier (NSID) 指定该命令作用的命名空间标识符(如果不使用命名空间,则该字段为 0)
15:08 Reserved 保留位
39:16 Number of Dwords in Data Transfer (NDT) 数据传输的字长数,指定传输的数据大小
47:44 Number of Dwords in Metadata Transfer (NDM) 元数据传输的字长数,指定传输的元数据大小
51:48 Command Dword 12 (CDW12) 命令特定字段
55:52 Command Dword 13 (CDW13) 命令特定字段
59:56 Command Dword 14 (CDW14) 命令特定字段
63:60 Command Dword 15 (CDW15) 命令特定字段

字段说明:

  1. NSID(命名空间标识符)
  2. 表示命令应用的 命名空间
  3. 如果命令 不使用命名空间 ID,该字段应设置为 0h
  4. 如果值为 FFFFFFFFh,命令将应用于所有命名空间,这是一个广播地址。

  5. NDT(数据传输的字长数)

  6. 指定数据传输中涉及的 字长数(DWORDs),帮助控制器计算数据传输的具体字节数。

  7. NDM(元数据传输的字长数)

  8. 指定 元数据 传输时使用的 字长数

命令特定字段(CDW12, CDW13, CDW14, CDW15)

  • 这些字段是 命令特定 的,用于扩展命令的功能,提供额外的信息或参数。

📘 二、Common Completion Queue Entry(通用完成队列条目)

完成队列条目布局:

Figure 89 描述了完成队列条目的前 16 字节的布局,它是每个完成队列条目的核心结构。完成队列条目通常至少有 16 字节大小,并包含以下字段:

位(Bits) 字段名 描述
DW0 Command Specific 命令特定字段(根据不同命令的需求定义)
DW1 Command Specific 命令特定字段(根据不同命令的需求定义)
DW2 SQ Identifier 提交队列标识符(SQ)
DW3 SQ Head Pointer 提交队列头指针(SQHD)
P Phase Tag 阶段标签(Phase Tag),用于区分响应的状态
Command Identifier Command Identifier 命令标识符,用于关联响应和请求

字段详细说明:

  1. DW0 和 DW1(命令特定字段):
  2. 这两个字段根据实际命令的不同而具有不同的含义。每个命令定义了这些字段的具体内容。例如,对于某些命令,这些字段可能包含状态信息、命令特定的数据结构或控制信息。

  3. SQ Identifier

  4. 表示 提交队列标识符,它是队列的唯一标识符。控制器通过此字段确定哪一个提交队列触发了这个完成条目的响应。

  5. SQ Head Pointer

  6. 提交队列头指针(SQHD),用于指示控制器已处理的命令位置。这个指针帮助主机判断队列中的命令是否被控制器消费。

  7. Phase Tag

  8. 用于标记 队列中的响应阶段,确保响应的顺序与请求的顺序一致。Phase Tag 是一个重要的同步机制,防止响应错乱。

  9. Command Identifier

  10. 用于唯一标识此响应所关联的 命令请求。这个标识符帮助主机将响应与对应的命令请求匹配。

响应胶囊的多个写入:

  • 如果一个完成队列条目是通过多次写入构建的,Phase Tag 会在最后一次写入时进行更新,以确保响应的完整性和一致性。

🧠 总结与关键点

字段/功能 说明
NSID 命令适用的命名空间标识符,FFFFFFFFh 用于广播命令。
NDT/NDM 数据和元数据传输的字长数,帮助控制器理解数据传输大小。
CDW12 ~ CDW15 命令特定字段,提供额外的命令扩展信息,具体内容根据命令而定。
SQ Identifier & SQ Head Pointer 标识提交队列并提供队头指针,帮助主机同步响应与命令的关系。
Phase Tag 阶段标签,保证响应与请求的顺序一致,防止响应错乱。
Command Identifier 唯一标识关联命令的标识符,帮助主机正确匹配响应。

如果你希望进一步了解:

  • SGL 描述符的具体类型,以及如何在命令中使用 MPTR 和 DPTR 字段
  • 命令和完成队列条目的关联机制,以及如何通过 SQHD 和 Phase Tag 管理队列
  • 更多命令特定字段的定义,如何根据不同的命令类型扩展和使用这些字段

我可以继续为你提供详细分析。你希望我们下一步深入探讨哪些方面?