队列模型 - 📘 结构概览:Command Dword 0(CDW0) (第103页)
NVME2.0协议解读 1 min read

队列模型 - 📘 结构概览:Command Dword 0(CDW0) (第103页)

Blog Author

以下是对 《NVM Express® Base Specification, Revision 2.0b》 中关于 Command Dword 0(命令字第0双字) 的中文深入分析与教学讲解,帮助你更系统地理解协议结构:


📘 结构概览:Command Dword 0(CDW0)

Command Dword 0 是所有 NVMe 命令通用格式(Common Command Format)中的第一部分,定义了本次命令的基本特性,比如使用的传输方式、是否是融合操作、命令码等。


🔹 位字段解析(Figure 86)

位段位宽 字段名 描述
15:14 PSDT (PRP or SGL for Data Transfer) 指定该命令是否使用 PRPSGL 来传输数据。PRP(Physical Region Page)适用于 PCIe 实现;SGL(Scatter-Gather List)适用于 NVMe over Fabrics。
13:10 Reserved 保留,必须填 0。
09:08 FUSE (Fused Operation) 是否为“融合操作”中的一部分。
07:00 OPC (Opcode) 要执行的命令码(Opcode)。根据该字段判断本条命令的功能。

🧠 深入解析:

✅ PSDT (Bit 15:14) — 数据传输方式选择

这是 NVMe 中非常关键的字段,用于决定命令数据传输时采用的内存地址机制。

PSDT 值 含义 说明
00b 使用 PRP(Physical Region Page) 典型的 PCIe 下的 Admin 命令使用方式。
01b 使用 SGL,MPTR 指向一个物理缓冲区 MPTR(Metadata Pointer)为元数据地址。此缓冲区为单段物理地址,需参考控制器识别结构中的 bit 17 对齐要求。
10b 使用 SGL,MPTR 指向一个 SGL 段(仅含1个描述符) MPTR 指向一个 SGL Segment,Segment 中仅有一个 SGL 描述符,且需 Qword(8字节)对齐。
11b 保留 不可使用。

🔍 注意: - 如果元数据(Metadata)未与用户数据交织(interleaved),则需通过 MPTR 指定其地址。 - PCIe 下 Admin 命令必须使用 PRP,不支持 SGL!


✅ FUSE (Bit 9:8) — 融合操作标志

融合操作用于将两个 NVMe 命令“融合”为一个原子性复合操作,常用于元数据+用户数据的同步操作等。

FUSE 值 含义
00b 普通操作(非融合)
01b 本命令为融合操作中的第一条命令
10b 本命令为融合操作中的第二条命令
11b 保留

📝 控制器在执行融合命令时,要求两个命令必须按顺序、连续投递。详细机制见主规范 §3.4.2。


✅ OPC (Bit 7:0) — 操作码(Opcode)

Opcode 是判断命令类型的关键字段。

  • 示例:
  • 0x06 = Identify 命令
  • 0x0C = Get Features 命令
  • 0x80 ~ 0xFF 范围可能为厂商自定义命令

不同命令集(如 Admin Command Set vs. I/O Command Set)拥有不同的 Opcode 编码。所有命令都以此字段作为入口进行解析。


📘 Common Command Format(Figure 87)

字节 字段 描述
0–3 CDW0 即上面分析的 Command Dword 0。
4–7 Namespace Identifier (NSID) 命令作用的 Namespace ID。部分命令不使用该字段时,需置 0。特殊值 FFFFFFFFh 表示广播(广播到所有 namespace/subsystem)。

✅ NSID 说明:

含义
0x00000000 表示该命令不使用 Namespace,或非作用于某个命名空间。
0xFFFFFFFF 广播命名空间 ID,具体广播范围依命令而定(详见 §3.2.1.2)
其他有效值 实际命名空间编号

🔍 注意异常处理: - 若命令要求 NSID,但提供的是 0xFFFFFFFF,则应报错:Invalid Field in Command。 - 若提供一个非激活的命名空间 ID,应报错:Invalid Field in Command。 - 若提供一个无效的命名空间 ID,则报错:Invalid Namespace or Format


✅ 学习建议与小结:

重点 学习提示
PSDT 的值影响数据传输结构 不同传输方式(PRP vs. SGL)适用于不同场景,务必结合接口类型(PCIe vs. Fabrics)理解。
FUSE 是 NVMe 的原子操作机制 熟悉两个命令如何配对,并查阅 §3.4.2
Opcode 是命令解析核心 可以做一张表,记录常见 Opcode 及其功能,方便查阅
NSID 字段需注意有效性 特殊值 0xFFFFFFFF 仅在特定命令中有效,否则会导致命令中止。

如果你有想继续深入的内容,比如某个具体命令(如 Identify)、SGL 描述符结构,或想要逐字段构造一条命令示例,我可以继续辅导你逐步理解与构造。需要我继续带你深入下一段内容吗?