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

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

Blog Author

我们继续深入分析 NVM Express® Base Specification, revision 2.0b 中的第 156 页内容,特别是 创建 I/O 完成队列命令(Create I/O Completion Queue Command)的详细结构和状态码,以及 创建 I/O 提交队列命令(Create I/O Submission Queue Command)的基础介绍。


✅ 一、创建 I/O 完成队列命令(Create I/O Completion Queue Command)

1. 命令 Dword 11 结构(见 Figure 156)

位区间 字段 描述
31:16 Interrupt Vector (IV) 该字段的值是传输特定的,如果需要,应该在适用的 NVMe 传输绑定规范 中描述。如果传输没有定义该字段,则该字段应清零(0h)。
15:02 Reserved 保留
01 Interrupts Enabled (IEN) 如果设置为 1,则启用该完成队列的中断;如果设置为 0,则禁用中断。
00 Physically Contiguous (PC) 如果设置为 1,则该完成队列是物理连续的,且 PRP Entry 1(PRP1)是连续物理缓冲区的地址。如果设置为 0,则该完成队列不是物理连续的,且 PRP Entry 1(PRP1)是 PRP List 指针。如果 PC = 0CAP.CQR = 1,控制器应返回 Invalid Field in Command 错误。
如果队列位于 控制器内存缓冲区(CMB) 中,并且 CMBLOC.CQPDS = 0,控制器应中止命令并返回 Invalid Use of Controller Memory Buffer 状态。

2. 创建 I/O 完成队列命令的状态值(见 Figure 157)

状态值 描述
1h Invalid Queue Identifier:如果指定的队列标识符无效,创建完成队列失败。无效的队列标识符包括:标识符为 0h(表示 Admin Queue)、超出了控制器支持的范围,或已在使用的完成队列标识符。
2h Invalid Queue Size:主机尝试创建的 I/O 完成队列大小无效。常见的无效情况包括:
- 队列条目的数量为 0h 或超过控制器支持的最大值(由 CAP.MQES 指定);
- 没有正确初始化 CC.IOCQES 字段。
8h Invalid Interrupt Vector:指定的中断向量无效,导致 I/O 完成队列的创建失败。

✅ 二、创建 I/O 提交队列命令(Create I/O Submission Queue Command)

1. 功能简介

创建 I/O 提交队列命令用于创建 I/O 提交队列(I/O Submission Queues),而 Admin Submission Queue 是通过在 ASQ 属性 中指定其基地址来创建的。

2. PRP List 的管理

  • 如果命令中提供了 PRP List 来描述提交队列(Submission Queue,SQ),则主机软件必须将 PRP List 保持在物理内存的相同位置,并且在 Delete I/O Submission Queue 命令完成之前,不得修改 PRP List 中的值。如果修改了 PRP List,则行为是未定义的

🧠 学习总结

操作类型 关键字段 错误处理 描述
创建 I/O 完成队列 Interrupt Vector, IEN, PC Invalid Queue IdentifierInvalid Queue SizeInvalid Interrupt Vector 用于创建非 Admin 类型的 I/O 完成队列
创建 I/O 提交队列 PRP List, ASQ PRP List 不可修改,必须正确管理 创建 I/O 提交队列,类似于完成队列,但管理方式有所不同

扩展学习建议

  • PRP List 和物理内存管理:如何确保 PRP List 的正确使用和避免修改引起的未定义行为。
  • 中断机制IEN 字段与中断向量在控制器操作中的作用,如何确保队列创建后能正确触发中断。
  • 创建和删除队列的协调机制:如何通过 Create I/O Completion QueueDelete I/O Completion Queue 命令管理队列的生命周期。

如果你希望深入某一部分,或者希望了解更具体的命令包封装与队列管理的实例,请继续提问,我可以带你逐步解析。你想进一步学习哪个方面呢?