队列模型 - 📘 一、Common Command Format(通用命令格式) (第105页)
我们继续深入分析 NVM Express® Base Specification, revision 2.0b 第 94 页 的内容,重点讲解 Common Command Format 和 Common 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) | 命令特定字段 |
✅ 字段说明:
- NSID(命名空间标识符):
- 表示命令应用的 命名空间。
- 如果命令 不使用命名空间 ID,该字段应设置为 0h。
-
如果值为
FFFFFFFFh,命令将应用于所有命名空间,这是一个广播地址。 -
NDT(数据传输的字长数):
-
指定数据传输中涉及的 字长数(DWORDs),帮助控制器计算数据传输的具体字节数。
-
NDM(元数据传输的字长数):
- 指定 元数据 传输时使用的 字长数。
✅ 命令特定字段(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 | 命令标识符,用于关联响应和请求 |
✅ 字段详细说明:
- DW0 和 DW1(命令特定字段):
-
这两个字段根据实际命令的不同而具有不同的含义。每个命令定义了这些字段的具体内容。例如,对于某些命令,这些字段可能包含状态信息、命令特定的数据结构或控制信息。
-
SQ Identifier:
-
表示 提交队列标识符,它是队列的唯一标识符。控制器通过此字段确定哪一个提交队列触发了这个完成条目的响应。
-
SQ Head Pointer:
-
提交队列头指针(SQHD),用于指示控制器已处理的命令位置。这个指针帮助主机判断队列中的命令是否被控制器消费。
-
Phase Tag:
-
用于标记 队列中的响应阶段,确保响应的顺序与请求的顺序一致。Phase Tag 是一个重要的同步机制,防止响应错乱。
-
Command Identifier:
- 用于唯一标识此响应所关联的 命令请求。这个标识符帮助主机将响应与对应的命令请求匹配。
✅ 响应胶囊的多个写入:
- 如果一个完成队列条目是通过多次写入构建的,Phase Tag 会在最后一次写入时进行更新,以确保响应的完整性和一致性。
🧠 总结与关键点
| 字段/功能 | 说明 |
|---|---|
| NSID | 命令适用的命名空间标识符,FFFFFFFFh 用于广播命令。 |
| NDT/NDM | 数据和元数据传输的字长数,帮助控制器理解数据传输大小。 |
| CDW12 ~ CDW15 | 命令特定字段,提供额外的命令扩展信息,具体内容根据命令而定。 |
| SQ Identifier & SQ Head Pointer | 标识提交队列并提供队头指针,帮助主机同步响应与命令的关系。 |
| Phase Tag | 阶段标签,保证响应与请求的顺序一致,防止响应错乱。 |
| Command Identifier | 唯一标识关联命令的标识符,帮助主机正确匹配响应。 |
如果你希望进一步了解:
- SGL 描述符的具体类型,以及如何在命令中使用 MPTR 和 DPTR 字段
- 命令和完成队列条目的关联机制,以及如何通过 SQHD 和 Phase Tag 管理队列
- 更多命令特定字段的定义,如何根据不同的命令类型扩展和使用这些字段
我可以继续为你提供详细分析。你希望我们下一步深入探讨哪些方面?