第4章 消息服务模型与控制原语 - 页码68
我们继续深入分析 NVMe-MI 2.0 规范第 69 页内容,这页包含三个关键部分:
- ✅ Figure 51:将 NVMe-MI 响应消息映射到 NVMe Completion Queue Entry (CQE) 的表格
- ✅ Figure 52:解释 CQE 的 Dword 0 中具体 bit 字段的结构和含义
- ✅ NVMe-MI Send 命令的服务模型介绍(开始于第 53 阶段)
✅ 一、Figure 51:响应消息字段映射到 CQE(表格形式)
这是对上一页 Figure 50 图解的文字补充,以更明确说明每个 NVMe-MI 响应字段与 CQE 字段的对应关系。
🔹 字段映射总览
NVMe-MI 响应字段 | SQE 映射字段 | 说明 |
---|---|---|
00 – MCTP Data (MCTPD) | n/a | MCTP 封装相关字段,带内机制中不使用 |
01 – NVMe-MI Message Parameters (NMP) | n/a | 带内机制不需要,字段被省略 |
02–03 – Reserved | n/a | 无对应字段 |
04 – Status (STATUS) | CQE DW0 Byte 0 | 映射到 Tunneled Status (TSTAT) 字段 |
05–07 – NVMe Management Response (NMRESP) | CQE DW0 Bytes 1–3 | 映射到 Tunneled NVMe Management Response (TNMRESP) |
08–N – Response Data | n/a | 不作为 CQE 的一部分,存于数据缓冲区(Data Buffer)中 |
MIC | n/a | 带内机制不使用 MIC |
✅ 二、Figure 52:CQE Dword 0 字段定义(NSCQED0)
这个字段位于 CQE 的 DW0(前 32 位) 中,封装了两个重要字段:
Bits | 字段名 | 描述 |
---|---|---|
31:08 | TNMRESP (Tunneled NVMe Management Response) | NVMe-MI 命令的响应数据(如结构体 ID、版本等) |
07:00 | TSTAT (Tunneled Status) | NVMe-MI 命令处理状态码(如 Success、Invalid Parameter) |
📌 如果 NVMe Context 中出现错误(如 CDW0~9 格式错误),则:
- TSTAT 与 TNMRESP 都被置为 0h
- NVMe CQE 中的通用状态码会返回错误(例如 Invalid Field)
🧠 理解重点:
CQE 字段 | 说明 |
---|---|
Status Code (SC) | 返回通用 NVMe 状态,如命令解析错误、字段无效等 |
DW0 的 TSTAT/TNMRESP | 承载来自 NVMe-MI 的状态反馈和业务数据 |
也就是说,CQE 的 DW0 封装了隧道中原始 NVMe-MI 响应的核心信息,而普通的 CQE 状态字段用于标识 Admin Command 是否本身执行成功。
✅ 三、NVMe-MI Send 命令的服务模型简介(开始阶段)
本节为 Figure 53 服务模型流程图的文字说明部分
🎯 服务模型阶段 1:NVMe 层处理(NVMe Context)
- 检查命令 Dword0 ~ Dword9(CDW0~CDW9)
- 如果存在错误(字段无效、不支持的命令等):
- NVMe-MI Send 命令失败
- CQE.Status 返回错误状态码
- CQE.DW0 的 TNMRESP 与 TSTAT 全部清零
📌 常见检查内容包括:
字段 | 检查内容 |
---|---|
CDW0 | Opcode 合法性(必须为 NVMe-MI Send) |
NSID | 应为 0 |
DPTR | 指针合法性及对齐 |
CID、SQID、QSIZE 等 | NVMe 规范中定义的标准 Admin 命令参数 |
🧩 若 CDW0–CDW9 无错误 → 进入 Phase 2
- 检查 CDW10~15(也就是 NVMe-MI Request Message 的主体部分)
- 若没有携带数据(Request Data),那么 CDW10~15 就是完整命令
- 错误示例:无效 Opcode、字段超界等
- 若有错误,同样返回 NVMe 错误状态,且 TNMRESP/TSTAT 清零
📌 小结:CQE 响应字段与状态传递机制
响应结果 | CQE 中表现 | NVMe-MI 结果 | 说明 |
---|---|---|---|
NVMe-MI 成功 | CQE.Status = Success CQE.DW0.TSTAT = 00h CQE.DW0.TNMRESP = 响应内容 |
正常完成 | |
NVMe-MI 失败 | CQE.Status = Success CQE.DW0.TSTAT ≠ 00h (如参数错误) |
逻辑失败 | 管理控制器仍能读取响应内容 |
NVMe 层失败 | CQE.Status ≠ Success CQE.DW0 全部为 0 |
协议结构错误 | 主控无法获得 NVMe-MI 结果 |
✅ 下一步建议
下一页将进入 Figure 53:NVMe-MI Send Command Servicing Model 流程图,详细展示从 NVMe 处理到 NVMe-MI 指令执行的完整链路。
是否继续解析这部分?或者你希望我为整个 Send + CQE 响应模型绘制一个完整的数据流图帮助记忆?