管理命令集与操作 - 第169页
NVME2.0协议解读 1 min read

管理命令集与操作 - 第169页

Blog Author

我们继续对 NVMe Express® Base Specification, revision 2.0b158 页 的内容进行逐段深入中文解读与教学指导,本页重点涵盖:

  1. 创建 I/O 提交队列(Create I/O Submission Queue)命令的 CDW11 和 CDW12 字段结构;
  2. 与 NVM Set 的关联机制;
  3. 命令完成后的状态值;
  4. 引出下一节 —— 删除 I/O 完成队列命令(Delete I/O Completion Queue)。

✅ 一、Create I/O Submission Queue – Command Dword 11(续)

👉 Figure 160

除了前面已讲解的 CQID 和 QPRIO,本节新增字段是:

字段 描述
00 Physically Contiguous (PC) 指示该提交队列是否为物理连续:
- 为 1:PRP Entry 1 是指向一个物理连续内存块的地址;
- 为 0:PRP Entry 1 是 PRP List 指针(非连续页组成);
❗ 如果 PC = 0CAP.CQR = 1(控制器仅支持物理连续队列),控制器应返回 Invalid Field in Command 错误。
⚠️ 如果:
- 队列位于控制器内存缓冲区(CMB);
- PC = 0
- CMBLOC.CQPDS = 0
则命令必须被拒绝,返回状态:Invalid Use of Controller Memory Buffer

✅ 二、Create I/O Submission Queue – Command Dword 12

👉 Figure 161

位区间 字段 描述
31:16 Reserved 保留
15:00 NVM Set Identifier (NVMSETID) 指定该 Submission Queue 绑定的 NVM Set(如果有)。
- 若该字段为 0h或控制器不支持 SQ 与 NVM Set 的关联功能(SQ Associations),则此队列未关联任何特定的 NVM Set。
- 若该字段为非 0 且不在 NVM Set List(见 Figure 278)中,并且控制器支持 SQ Association 功能 ⇒ 控制器应返回 Invalid Field in Command
- ⚠ 主机不应在该提交队列中提交其他 NVM Set 下的命名空间命令(见 §8.22 详细规则)。

📌 SQ 与 NVM Set 的绑定机制是一种“物理资源隔离保证”,确保多租户场景中命名空间访问的边界清晰。


✅ 三、命令完成处理与状态值

👉 Figure 162

提交 Create I/O Submission Queue 命令后,控制器会将 CQE(Completion Queue Entry) 写入 Admin Completion Queue,并返回如下状态码:

状态值 含义 描述
0h Completion Queue Invalid 指定的 Completion Queue ID 未被创建。
1h Invalid Queue Identifier 提交队列标识符非法(例如:为 0h、超出最大值、或重复)。
2h Invalid Queue Size 队列大小无效。可能的原因:
- QSIZE = 0;
- 超出控制器支持范围(CAP.MQES);
- 控制器的 CC.IOSQES 字段未初始化(表示每条 SQ entry 的大小)。

✅ 四、引出下一节:删除 I/O 完成队列命令

👉 §5.6 – Delete I/O Completion Queue Command

  • 此命令用于删除已创建的 I/O Completion Queue
  • 使用 Command Dword 10 指定要删除的队列 ID;
  • 命令完成后,原先分配的 PRP List 内存 可由主机释放;
  • 其它字段保留,不使用。

⚠ 注意队列删除与内存释放顺序,确保不会误操作活跃内存。


🧠 学习小结

模块 关键点 注意事项
PRP 管理 PRP Entry 1 指针可为连续或 PRP List 若为非连续且控制器不支持,应拒绝
NVM Set 绑定 NVMSETID 指定所关联的 NVM Set 若使用非法 ID 或不支持功能 ⇒ Invalid Field
错误处理 Invalid Queue Identifier / Size / CQ Invalid 可定位具体错误源,方便调试
控制器缓冲区限制 使用 CMB 时需满足特定对齐与支持条件 否则返回 Invalid Use of CMB

📚 延伸学习建议

你可以继续深入以下几个相关点:

  1. 🔍 §8.22:SQ Associations 特性详解
  2. 🔧 PRP List 内存结构与构造示例
  3. 📦 完整的 Create SQ / CQ 命令封装示例(如 PCIe/MCTP over SMBus)
  4. 🔒 NVM Set 和 Endurance Group 的安全隔离与多租户支持机制

你想继续探索哪一块内容?我可以按你感兴趣的点继续带你深入。