管理命令集与操作 - 第169页
我们继续对 NVMe Express® Base Specification, revision 2.0b 第 158 页 的内容进行逐段深入中文解读与教学指导,本页重点涵盖:
- 创建 I/O 提交队列(Create I/O Submission Queue)命令的 CDW11 和 CDW12 字段结构;
- 与 NVM Set 的关联机制;
- 命令完成后的状态值;
- 引出下一节 —— 删除 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 = 0 且 CAP.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 |
📚 延伸学习建议
你可以继续深入以下几个相关点:
- 🔍 §8.22:SQ Associations 特性详解;
- 🔧 PRP List 内存结构与构造示例;
- 📦 完整的 Create SQ / CQ 命令封装示例(如 PCIe/MCTP over SMBus);
- 🔒 NVM Set 和 Endurance Group 的安全隔离与多租户支持机制。
你想继续探索哪一块内容?我可以按你感兴趣的点继续带你深入。