继续深入分析 NVM Express® Base Specification, revision 2.0b 第 95 页,我们将重点讲解 完成队列条目中的字段结构,特别是 SQ Identifier、SQ Head Pointer、Status Field、Phase Tag 和 Command Identifier,以及它们在完成队列中的作用和实现细节。
✅ SQ Identifier(SQID)
- 功能:该字段用于指示命令所属的 提交队列(Submission Queue)。
- 作用:
- 当 多个提交队列共享一个完成队列 时,SQID 与 命令标识符(CID) 一起,帮助主机软件 唯一确定已完成的命令。
- 在 NVMe over Fabrics 实现中,此字段是 保留的,即在这类实现中不使用。
| 位(Bits) |
描述 |
| 31:16 |
SQID:指示命令所属的提交队列标识符。 |
✅ SQ Head Pointer(SQHD)
- 功能:该字段表示 提交队列 的当前头指针,用于指示 已消费的队列项,这些队列项可以被主机重新使用。
- 作用:
- 控制器在将完成条目放入完成队列时返回此字段的值。
- 注: 这个值是控制器在创建完成队列条目时的头指针值。主机在消费该完成条目时,控制器的头指针可能已经前进。
| 位(Bits) |
描述 |
| 15:00 |
SQHD:提交队列的头指针,帮助主机了解哪些命令已经被处理。 |
✅ Status Field(SF)
- 功能:该字段用于指示命令的完成状态,表示该命令是否成功执行,或者是否出现了致命错误或非致命错误。
| 位(Bits) |
描述 |
| 31:17 |
Status Field(SF):表示命令的完成状态,具体的状态码由控制器定义。 |
状态字段值为 0h 时,表示命令成功完成,无错误发生。
✅ Phase Tag(P)
- 功能:此字段用于标识完成队列条目是否为新条目,帮助区分同一队列中的多个条目的处理状态。
- 作用:
- 主机在设置 CC.EN 时,Phase Tag 被初始化为
0。
- 控制器在放置条目时,Phase Tag 将会反转(
0 → 1 或 1 → 0),以区分新的完成条目。
| 位(Bits) |
描述 |
| 16 |
Phase Tag(P):区分新响应条目和已处理的响应条目。 |
注意:在 NVMe over Fabrics 实现中,Phase Tag 是 保留的,即在该实现中不使用此字段。
✅ Command Identifier(CID)
- 功能:此字段表示命令标识符,用于标识与完成队列条目关联的命令。
- 作用:
- 该标识符是主机在将命令提交到提交队列时分配的,主机可以通过它来追踪特定的命令。
- CID 与 SQID 一起,唯一标识命令及其完成状态。
| 位(Bits) |
描述 |
| 15:00 |
CID:命令标识符,主机用来追踪命令的提交与完成状态。 |
✅ Do Not Retry(DNR)
- 功能:如果设置为
1,表示如果该命令重新提交到控制器,预计该命令会失败。
- 作用:
- 如果发生超时错误恢复(如错误恢复失败),则该字段将被清除为
0。
- 如果命令被标记为不可重试,控制器将不会尝试再次处理该命令。
| 位(Bits) |
描述 |
| 31 |
DNR:标记该命令是否不可重试。 |
✅ More(M)
- 功能:此字段指示是否有更多的状态信息可供查询。
- 作用:
- 如果设置为
1,表示有更多的错误信息可通过 Get Log Page 命令获取。
- 如果设置为
0,表示没有更多的状态信息。
| 位(Bits) |
描述 |
| 30 |
M:指示是否有更多的状态信息。 |
🧠 总结与关键点
| 字段/功能 |
说明 |
| SQ Identifier |
表示命令所属的提交队列,当多个队列共享同一完成队列时,帮助主机区分命令来源。 |
| SQ Head Pointer |
提交队列的头指针,帮助主机识别哪些命令已被控制器消费并可以重用。 |
| Status Field |
表示命令的完成状态,成功完成时为 0h,错误发生时为其他状态码。 |
| Phase Tag |
标识完成队列条目是否为新条目,确保响应顺序一致性。 |
| Command Identifier |
唯一标识命令的标识符,主机用它来追踪命令与完成队列条目的关联。 |
| DNR(Do Not Retry) |
标记命令是否可以重试,避免因命令失败被重复提交。 |
| More(M) |
标识是否有更多的错误信息可通过 Get Log Page 命令查询。 |
如果你希望继续深入了解:
- 状态字段(Status Field)中不同状态码的详细定义
- Phase Tag 的使用方式及其对响应顺序的影响
- 如何优化命令标识符(CID)和提交队列标识符(SQID)在并发环境下的管理
我可以继续为你提供更深入的解析。你希望接下来进一步探讨哪些内容?