管理命令集与操作 - 第167页
我们继续深入分析 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 = 0 且 CAP.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 Identifier,Invalid Queue Size,Invalid Interrupt Vector | 用于创建非 Admin 类型的 I/O 完成队列 |
| 创建 I/O 提交队列 | PRP List, ASQ |
PRP List 不可修改,必须正确管理 | 创建 I/O 提交队列,类似于完成队列,但管理方式有所不同 |
扩展学习建议
- PRP List 和物理内存管理:如何确保 PRP List 的正确使用和避免修改引起的未定义行为。
- 中断机制:
IEN字段与中断向量在控制器操作中的作用,如何确保队列创建后能正确触发中断。 - 创建和删除队列的协调机制:如何通过 Create I/O Completion Queue 和 Delete I/O Completion Queue 命令管理队列的生命周期。
如果你希望深入某一部分,或者希望了解更具体的命令包封装与队列管理的实例,请继续提问,我可以带你逐步解析。你想进一步学习哪个方面呢?