管理命令集 - ✅ 一、创建 I/O 提交队列命令结构 (第168页)
我们继续深入分析 NVM Express® Base Specification, revision 2.0b 中的第 157 页内容,特别是关于 创建 I/O 提交队列命令(Create I/O Submission Queue Command)的详细结构,主要涉及 PRP Entry 1、Command Dword 10 和 Command Dword 11 字段的使用和错误处理。
✅ 一、创建 I/O 提交队列命令结构
1. PRP Entry 1(见 Figure 158)
PRP Entry 1 主要用于指定提交队列的物理地址或者 PRP List 的指针。具体如下:
| 位区间 | 字段 | 描述 |
|---|---|---|
| 63:00 | PRP Entry 1 (PRP1) | - 如果 CDW11.PC = 1,该字段指定一个 64 位基内存地址指针,指向物理连续的提交队列。地址应按内存页对齐(根据 CC.MPS 的值)。 - 如果 CDW11.PC = 0,该字段指定一个 PRP List 指针,指向构成提交队列的内存页列表。列表中的页应该按内存页对齐(根据 CC.MPS 的值)。 - 无论是哪种情况,PRP Entry 的偏移量都应为 0h。如果存在非零偏移量,控制器应返回 PRP Offset Invalid 错误。 |
2. 命令 Dword 10 结构(见 Figure 159)
| 位区间 | 字段 | 描述 |
|---|---|---|
| 31:16 | Queue Size (QSIZE) | 指定要创建的提交队列的大小。 - 如果队列大小为 0h 或超出了控制器支持的最大大小,则控制器应返回 Invalid Queue Size 错误。- 这是一个从零开始的值。 |
| 15:00 | Queue Identifier (QID) | 指定为该提交队列分配的标识符。 - 此标识符对应 Submission Queue Tail Doorbell(用于该命令的 CQyTDBL)。 - 此值不得超过 Number of Queues 字段所报告的最大值。如果指定的值为 0h、超出了支持的最大队列数,或已在使用中,则控制器应返回 Invalid Queue Identifier 错误。 |
3. 命令 Dword 11 结构(见 Figure 160)
| 位区间 | 字段 | 描述 |
|---|---|---|
| 31:16 | Completion Queue Identifier (CQID) | 指定与此提交队列相关的完成队列标识符。 - 如果指定值为 0h(即 Admin Completion Queue),控制器应返回 Invalid Queue Identifier 错误。- 如果指定值超出了控制器支持的范围,控制器应返回 Invalid Queue Identifier 错误。 - 如果指定值在控制器支持的范围内,但没有创建相应的 I/O 完成队列,控制器应返回 Completion Queue Invalid 错误。 |
| 15:03 | Reserved | 保留 |
| 02:01 | Queue Priority (QPRIO) | 指定提交队列的优先级类别,仅当使用加权轮询(Weighted Round Robin)并启用紧急优先级类别时有效。若不使用此机制,该字段将被忽略。 优先级值: - 00b → 紧急(Urgent)- 01b → 高(High)- 10b → 中(Medium)- 11b → 低(Low) |
✅ 二、错误处理与状态值
1. 错误状态码(见 Figure 157)
| 状态值 | 描述 |
|---|---|
| 1h | Invalid Queue Identifier:提交队列的标识符无效,可能是 0h(表示 Admin Queue)、超出控制器支持的范围,或已在使用中的标识符。 |
| 2h | Invalid Queue Size:创建提交队列时,指定的队列大小无效。可能原因包括:队列条目的数量为 0h 或超过了控制器支持的最大值,或者 CC.IOCQES 字段未正确初始化。 |
| 8h | Invalid Interrupt Vector:指定的中断向量无效,导致提交队列的创建失败。 |
🧠 学习总结
| 操作类型 | 关键字段 | 错误处理 | 描述 |
|---|---|---|---|
| 创建 I/O 提交队列 | PRP List, Queue Size, QID, CQID, QPRIO |
Invalid Queue Identifier, Invalid Queue Size, Invalid Interrupt Vector | 用于创建 I/O 提交队列,指定优先级、大小、标识符等 |
| PRP Entry 1 | PC, PRP List, Contiguous Queue | PRP Offset Invalid | 管理 PRP List 和物理内存,确保队列的连续性 |
| 队列标识符 | QID, CQID |
Invalid Queue Identifier, Completion Queue Invalid | 检查并管理队列标识符,确保其唯一性 |
| 优先级调度 | QPRIO |
- | 仅在使用加权轮询时有效,用于指定队列的优先级 |
扩展学习建议
如果你希望深入以下部分,欢迎继续提问:
- PRP 列表管理与优化:如何确保 PRP 列表的正确使用和避免未定义行为。
- 队列优先级调度机制:了解加权轮询调度和紧急优先级队列的工作原理。
- 队列标识符冲突处理与优化:如何避免队列标识符冲突,确保系统稳定性。
我可以进一步提供这些主题的示例和详细解释,帮助你更好地理解协议的应用。你想继续深入了解哪个方面呢?