队列模型 - 📘 一、继续分析通用命令状态码(1Ah 到 23h) (第110页)
NVME2.0协议解读 1 min read

队列模型 - 📘 一、继续分析通用命令状态码(1Ah 到 23h) (第110页)

Blog Author

我们继续深入分析 NVM Express® Base Specification, revision 2.0b 第 99 页 的内容,重点关注 更多的通用命令状态码,并解释其用途和实际应用场景。这些状态码涉及到如 Keep Alive命令中断设备保护等常见错误和状态信息。


📘 一、继续分析通用命令状态码(1Ah23h

状态码清单(1Ah23h

代码 名称 描述
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️⃣ 1AhKeep Alive Timeout Invalid

  • 原因:指定的 Keep Alive 超时值无效。通常是由于以下两种情况:
  • 在需要启用 Keep Alive 功能的传输中,设置了超时值 0h
  • 指定的超时值超过了传输协议的最大允许值。

场景:通常出现在 NVMe over Fabrics 环境下,主机和控制器间保持活跃连接时的超时设置错误。


2️⃣ 1BhCommand Aborted due to Preempt and Abort

  • 原因:命令被 预占并中止,通常与 预定访问命令(Reservation Acquire) 相关。
  • 预占(Preempt)指的是在命令执行时,其他更高优先级的命令要求抢占该命令的资源。

场景:在一个具有优先级的命令系统中,当一个命令被抢占时,它会被中止,以确保优先级命令的完成。


3️⃣ 1ChSanitize Failed

  • 原因:最近的 Sanitize 操作(设备消毒、清除数据等)失败,且没有成功恢复。
  • 常见应用:在存储介质上进行 数据销毁或清除 操作时,如果出现失败,控制器会返回此错误。

场景:常见于执行安全擦除命令时,如 sanitize 操作失败(可能由于硬件故障、介质损坏等原因)。


4️⃣ 1DhSanitize In Progress

  • 原因:正在进行 Sanitize 操作,此时所有其他命令会被拒绝。
  • 常见应用:当存储设备处于消毒状态时,无法进行其他读写操作。

场景:执行存储介质擦除时(如 SSD 的全盘加密清除),该状态码表示消毒操作正在进行中,且当前操作被禁用。


5️⃣ 1EhSGL Data Block Granularity Invalid

  • 原因:SGL 数据块粒度无效,通常是因为命令传输的 SGL 描述符所指示的数据块粒度不符合控制器要求。
  • 常见应用:在 NVMeZNS(Zone Namespace)环境下,SGL 描述符的粒度必须满足设备要求,否则会触发该错误。

场景:使用 SGL 描述符传输大数据时,粒度不合适(如数据块过大或过小)会导致该错误。


6️⃣ 1FhCommand Not Supported for Queue in CMB

  • 原因:该命令 不支持在控制器内存缓冲区(CMB)中提交。该错误特别适用于 Sanitize 命令。

场景:在 NVM Express 1.3 及以上版本 中,执行消毒命令时,控制器可能不支持通过 CMB 提交该命令。


7️⃣ 20hNamespace is Write Protected

  • 原因:命名空间的 写保护状态(Write Protected)使得该命令无法执行。

场景:通常用于防止重要数据被修改,命名空间被锁定为 只读 状态,直到解除写保护。


8️⃣ 21hCommand Interrupted

  • 原因:命令处理被 中断,控制器未能成功完成该命令。主机需要重新提交该命令。

场景:在控制器或主机由于临时性问题(如硬件错误、资源冲突等)中断命令执行时,控制器返回此错误。


9️⃣ 22hTransient Transport Error

  • 原因:检测到 临时传输错误,此错误通常是由于网络或通信中断引起的。如果重新提交,命令可能成功。

场景:如 NVMe over Fabrics 环境中出现短暂的连接中断或网络问题,重新提交命令通常能够成功。


🔟 23hCommand 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),或者了解如何在实际开发中处理这些状态码并进行错误恢复,随时告诉我!