队列模型与管理机制 - 第108页
NVME2.0协议解读 1 min read

队列模型与管理机制 - 第108页

Blog Author

继续分析 NVM Express® Base Specification, revision 2.0b 第 97 页 的内容,我们主要关注:

状态码(Status Code)定义
通用命令状态(Generic Command Status)具体命令状态 的定义
状态码的解释和应用,以及它们如何指示命令的执行状态或错误类型

这部分内容是理解控制器如何通过完成队列的状态字段反馈命令执行结果的关键。


📘 一、状态码的分类与选择

状态码的选择是由 状态码类型(SCT)状态码(SC) 组合来表示命令的状态。状态码分为多个类型,每个类型都包含不同的具体状态码,用于标识命令的执行结果或错误类型。

Vendor Specific 状态码(C0h to FFh)

  • 定义:如果状态码类型为 7h,则会使用厂商自定义的状态码范围 C0hFFh。这些状态码是供应商特定的,不同供应商可能定义不同的错误或状态码。

多个状态码的选择

  • 如果多个状态码条件适用,控制器会选择一个最合适的状态码返回给主机。

📘 二、通用命令状态(Generic Command Status)定义(Figure 94)

状态码类型为 0h 时,表示命令的 通用状态,适用于所有命令。这些状态码是 跨命令通用的,可以用来表示不同类型命令的常见错误或成功。

通用命令状态码列表

状态码 描述 适用于哪些命令
00h 命令成功完成:命令无错误地完成。 所有命令
01h 无效命令操作码:命令操作码字段包含预留值或不支持的值。 所有命令
02h 命令字段无效:命令中某个字段的值无效,除操作码外的字段。 所有命令
03h 命令 ID 冲突:命令标识符与另一个已存在的命令标识符冲突。 所有命令
04h 数据传输错误:命令的数据或元数据传输失败。 所有命令
05h 因电源丢失通知中止命令:命令因电源丢失通知被中止。 所有命令
06h 内部错误:命令未成功完成,出现内部设备错误。 所有命令
07h 命令请求中止:因接收到中止命令而中止当前命令。 所有命令
08h 命令因 SQ 删除被中止:提交队列被删除,命令被中止。 所有命令
09h 命令因融合命令失败被中止:命令因复合命令的其他部分失败而中止。 所有命令
0Ah 命令因缺少融合命令被中止:复合命令缺少另一个命令,导致当前命令中止。 所有命令
0Bh 无效命名空间或格式:命名空间或格式无效。 所有命令
0Ch 命令序列错误:命令因协议违规(例如,TCG 安全协议)而被中止。 所有命令

每个状态码的具体解释:

00h - 命令成功完成

  • 该状态码表示命令顺利执行,没有遇到任何错误。

01h - 无效命令操作码

  • 如果命令的操作码(Opcode)为预留值或不支持的值,会返回该错误状态。

02h - 命令字段无效

  • 当命令字段中包含无效或不支持的值(如参数字段、控制字段等),则返回该错误状态。这个错误码适用于多数情况,除非有其他状态码明确指定。

03h - 命令 ID 冲突

  • 如果命令的标识符(Command Identifier)已经被占用,或者在命令队列中找到冲突的命令 ID,将返回此错误。

04h - 数据传输错误

  • 传输命令的数据或元数据时发生错误。这可能是由于传输过程中的硬件故障、数据丢失或其他通信错误引起的。

05h - 电源丢失中止命令

  • 如果系统在命令执行过程中遭遇电源丢失或断电通知,正在执行的命令会被中止。

06h - 内部错误

  • 表示由于控制器的内部错误(如硬件故障、设备异常等)导致命令无法成功完成。

07h - 命令请求中止

  • 如果主机发出中止命令,指明要中止特定的提交队列(SQ)和命令 ID,则返回此状态。

08h - SQ 删除中止命令

  • 如果提交队列被删除,所有提交给该队列的命令将会被中止。

09h - 融合命令失败

  • 在复合命令执行中,某个部分命令失败,导致整个复合命令中止。

0Ah - 缺少融合命令

  • 如果复合命令的某部分缺失,将导致该命令中止。

0Bh - 无效命名空间或格式

  • 如果命名空间无效或格式错误,则命令将无法执行。

0Ch - 命令序列错误

  • 如果命令违反协议规则,尤其是在多命令序列中(如 TCG 安全协议的序列规则),将会触发此错误。

🧠 总结与关键点

状态码 说明
00h 命令成功完成
01h 无效命令操作码
02h 无效命令字段
03h 命令 ID 冲突
04h 数据传输错误
05h 电源丢失中止命令
06h 内部错误
07h 命令请求中止
08h 提交队列删除中止
09h 融合命令失败
0Ah 缺少融合命令
0Bh 无效命名空间或格式
0Ch 命令序列错误

如果你希望进一步理解:

  • 如何使用 Get Log Page 命令查询额外的状态信息,并具体分析 M 字段的使用
  • 不同状态码背后的实际应用场景,例如如何处理 命令重试命令中止
  • 厂商自定义状态码(C0h-FFh)的扩展,以及如何在不同场景下定义和使用这些状态码

我可以继续为你解答。你希望接下来深入探讨哪个方面?