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

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

Blog Author

我们继续对 NVM Express® Base Specification, revision 2.0b 第 96 页 进行中文深入解析与教学讲解,本页核心在于:

完成队列条目中的 Status Field 结构与含义
命令重试控制机制(CRD)
状态码类型(SCT)与状态码(SC)详细说明

这部分内容是理解命令完成后控制器如何向主机反馈执行状态的关键,同时也涉及如何判断命令是否可重试、是否发生介质或路径相关错误等。


📘 一、Status Field 字段结构(Figure 92)

Status Field 是完成队列条目的 DW3(第 3 个 Dword)的高 15 位,结构如下:

位范围 字段名 说明
31 DNR(Do Not Retry) 指示命令是否允许重试
30 M(More) 是否有更多状态信息(通过 Get Log Page 获取)
29:28 CRD(Command Retry Delay) 命令重试建议延迟时间
27:25 SCT(Status Code Type) 状态码类型,指示状态码属于哪类
24:17 SC(Status Code) 具体的命令状态码,表示命令成功、失败原因等
16 Phase Tag(P) 前页已讲,不属于 Status Field,但与之同一个 Dword
15:00 CID(Command Identifier) 同样属于 DW3,命令标识符

✅ 1. CRD – Command Retry Delay(命令重试延迟)

当命令失败且 DNR = 0(可重试) 且主机启用了 ACRE(高级重试启用),控制器可以通过 CRD 告诉主机应该等待多久再重试命令

CRD 值 建议延迟 来源字段(Identify Controller)
00b 不延迟,立即可重试 无需引用控制器数据结构
01b 等待 CRDT1 所指定的时间 Figure 275 中的 CRDT1 字段
10b 等待 CRDT2 指定的时间 CRDT2
11b 等待 CRDT3 指定的时间 CRDT3

⚠️ 条件触发说明: - 若 DNR = 1,或 Host 未设置 ACRE = 1h,则 CRD 字段为保留字段(不可使用)。 - 若 SCT 与 SC 都为 0h(表示成功),CRD 应设置为 00b


✅ 2. SCT – Status Code Type(状态码类型)

该字段指示 SC 字段中状态码的分类,便于主机理解状态码的语义。

SCT 值 类型 说明
0h 通用命令状态(Generic Command Status) 适用于所有命令的通用状态,如成功、非法字段等
1h 命令特定状态(Command Specific Status) 特定命令类型的状态,如固件无效、超出最大队列数
2h 介质/数据完整性错误(Media and Data Integrity Errors) 介质损坏、校验错误等
3h 路径相关状态(Path Related Status) 涉及主机与控制器之间路径或 ANA(Asymmetric Namespace Access)
4h–6h 保留
7h 厂商自定义(Vendor Specific) 供应商定义的扩展状态类型

✅ 3. SC – Status Code(状态码)

该字段表示具体的命令完成状态,结合 SCT 一起解释。每个状态码集划分为以下三段:

状态码范围 用途
00h–7Fh 管理命令(Admin)或通用命令
80h–BFh 特定于 I/O 命令集的状态码
C0h–FFh 保留或厂商自定义扩展

✔ 状态码 00h 通常表示命令 成功完成
✖ 非零状态码表示不同类型的错误,例如: - Invalid Field in Command - Invalid Namespace - Invalid Format - LBA Out of Range - 等等(详见 3.3.3.2.1.x 子章节)


🧠 总结与要点整理

字段名 说明与作用
DNR 控制器建议是否 禁止命令重试,若为 1,主机不应重试该命令
M 表示是否有更多错误信息可用,通过 Get Log Page 查询
CRD 表示建议的命令重试延迟时间(主机启用了 ACRE 且 DNR 为 0 时有效)
SCT 状态码类型,用于分类 SC 的语义:通用、特定、介质错误等
SC 命令完成的具体状态码,如成功、非法字段、命名空间无效等

🔁 CRD 与 ACRE 使用场景举例:

假设: - 控制器因临时资源不足导致命令失败。 - 设置了: - DNR = 0(可以重试) - CRD = 10b(建议使用 CRDT2 延迟后重试) - 主机 ACRE = 1(启用高级重试)

主机行为应为: 读取 Identify Controller 中的 CRDT2 值(单位为毫秒),等待相应时间后,再重新提交命令。


如果你希望继续了解:

  • 每个 SCT 下具体状态码(SC)清单与语义解析
  • CRDT1~3 在 Identify Controller 中的定义与配置
  • 如何使用 DNR / CRD 实现主机端智能重试机制

我可以继续为你系统讲解。你希望下一步分析哪部分内容?