队列模型 - 📘 一、继续分析通用命令状态码(1Ah 到 23h) (第110页)
我们继续深入分析 NVM Express® Base Specification, revision 2.0b 第 99 页 的内容,重点关注 更多的通用命令状态码,并解释其用途和实际应用场景。这些状态码涉及到如 Keep Alive、命令中断、设备保护等常见错误和状态信息。
📘 一、继续分析通用命令状态码(1Ah 到 23h)
✅ 状态码清单(1Ah 到 23h)
| 代码 | 名称 | 描述 |
|---|---|---|
1Ah |
Keep Alive Timeout Invalid | Keep Alive 超时值无效:可能是由于在要求启用 Keep Alive 功能的传输中指定了 0h,或超时值过大导致不适用当前传输类型。 |
1Bh |
Command Aborted due to Preempt and Abort | 因为接收到预占并中止命令,当前命令被中止(通常用于获取预定访问的命令)。 |
1Ch |
Sanitize Failed | 最近的 Sanitize 操作失败,且没有成功的恢复操作。 |
1Dh |
Sanitize In Progress | 在进行 Sanitize 操作 时,禁止其他功能或命令的执行。 |
1Eh |
SGL Data Block Granularity Invalid | SGL 数据块粒度无效:适用于特定 I/O 命令集,可能是由于数据块粒度不符合要求。 |
1Fh |
Command Not Supported for Queue in CMB | 控制器内存缓冲区(CMB)不支持提交此命令。仅适用于 Sanitize 命令(NVM Express 1.3 及以后版本)。 |
20h |
Namespace is Write Protected | 命令在命名空间为写保护状态时无法执行。 |
21h |
Command Interrupted | 命令执行被中断,控制器无法成功完成该命令。 |
22h |
Transient Transport Error | 检测到临时传输错误。如果重新尝试该命令,它很可能会成功。 |
23h |
Command Prohibited by Command and Feature Lockdown | 命令由于 命令与特性锁定(Lockdown) 被中止。 |
🧩 二、状态码解析
1️⃣ 1Ah – Keep Alive Timeout Invalid
- 原因:指定的 Keep Alive 超时值无效。通常是由于以下两种情况:
- 在需要启用 Keep Alive 功能的传输中,设置了超时值
0h; - 指定的超时值超过了传输协议的最大允许值。
场景:通常出现在 NVMe over Fabrics 环境下,主机和控制器间保持活跃连接时的超时设置错误。
2️⃣ 1Bh – Command Aborted due to Preempt and Abort
- 原因:命令被 预占并中止,通常与 预定访问命令(Reservation Acquire) 相关。
- 预占(Preempt)指的是在命令执行时,其他更高优先级的命令要求抢占该命令的资源。
场景:在一个具有优先级的命令系统中,当一个命令被抢占时,它会被中止,以确保优先级命令的完成。
3️⃣ 1Ch – Sanitize Failed
- 原因:最近的 Sanitize 操作(设备消毒、清除数据等)失败,且没有成功恢复。
- 常见应用:在存储介质上进行 数据销毁或清除 操作时,如果出现失败,控制器会返回此错误。
场景:常见于执行安全擦除命令时,如
sanitize操作失败(可能由于硬件故障、介质损坏等原因)。
4️⃣ 1Dh – Sanitize In Progress
- 原因:正在进行 Sanitize 操作,此时所有其他命令会被拒绝。
- 常见应用:当存储设备处于消毒状态时,无法进行其他读写操作。
场景:执行存储介质擦除时(如 SSD 的全盘加密清除),该状态码表示消毒操作正在进行中,且当前操作被禁用。
5️⃣ 1Eh – SGL Data Block Granularity Invalid
- 原因:SGL 数据块粒度无效,通常是因为命令传输的 SGL 描述符所指示的数据块粒度不符合控制器要求。
- 常见应用:在 NVMe 或 ZNS(Zone Namespace)环境下,SGL 描述符的粒度必须满足设备要求,否则会触发该错误。
场景:使用 SGL 描述符传输大数据时,粒度不合适(如数据块过大或过小)会导致该错误。
6️⃣ 1Fh – Command Not Supported for Queue in CMB
- 原因:该命令 不支持在控制器内存缓冲区(CMB)中提交。该错误特别适用于 Sanitize 命令。
场景:在 NVM Express 1.3 及以上版本 中,执行消毒命令时,控制器可能不支持通过 CMB 提交该命令。
7️⃣ 20h – Namespace is Write Protected
- 原因:命名空间的 写保护状态(Write Protected)使得该命令无法执行。
场景:通常用于防止重要数据被修改,命名空间被锁定为 只读 状态,直到解除写保护。
8️⃣ 21h – Command Interrupted
- 原因:命令处理被 中断,控制器未能成功完成该命令。主机需要重新提交该命令。
场景:在控制器或主机由于临时性问题(如硬件错误、资源冲突等)中断命令执行时,控制器返回此错误。
9️⃣ 22h – Transient Transport Error
- 原因:检测到 临时传输错误,此错误通常是由于网络或通信中断引起的。如果重新提交,命令可能成功。
场景:如 NVMe over Fabrics 环境中出现短暂的连接中断或网络问题,重新提交命令通常能够成功。
🔟 23h – Command Prohibited by Command and Feature Lockdown
- 原因:该命令被 命令与特性锁定(Lockdown) 限制,无法执行。锁定机制通常用于防止在特定条件下进行敏感操作。
场景:例如,某些命令在某些设备操作模式或安全模式下可能会被锁定,不允许执行。
🧠 总结与核心要点
| 状态码 | 说明 |
|---|---|
1Ah |
Keep Alive 超时无效:超时值设置不正确,通常是 0h 或过大。 |
1Bh |
命令因预占并中止被中止:预定命令要求抢占当前命令。 |
1Ch |
Sanitize 操作失败:消毒命令未成功执行,未完成恢复。 |
1Dh |
Sanitize 操作进行中:正在进行消毒操作,禁止其他命令。 |
1Eh |
SGL 数据块粒度无效:SGL 描述符的粒度不符合要求。 |
1Fh |
CMB 中不支持该命令:CMB 不支持提交该命令,通常为 Sanitize 命令。 |
20h |
命名空间写保护:命名空间被设置为写保护,无法执行写操作。 |
21h |
命令执行中断:命令处理被中断,控制器无法完成,主机需重试。 |
22h |
临时传输错误:暂时性网络或传输问题,通常重试可成功。 |
23h |
命令因锁定被禁止:命令被锁定机制禁止执行。 |
如果你希望进一步分析 I/O Command Set Specific 状态码(例如,NVM、ZNS),或者了解如何在实际开发中处理这些状态码并进行错误恢复,随时告诉我!