第4章 消息服务模型与控制原语 - 页码72
NVMe-MI 1 min read

第4章 消息服务模型与控制原语 - 页码72

Blog Author

太好了,我们现在来深入分析 NVMe-MI 2.0 规范第 73 页中的 Figure 54,它图解了 NVMe-MI Receive 命令的完整映射结构


✅ 一、Figure 54 总览:双向映射结构

该图清晰地展示了两个方向的映射关系:

左侧是:

📤 NVMe-MI Request Message → NVMe Admin Command SQE

右侧是:

📥 NVMe-MI Response Message → NVMe Completion Queue Entry (CQE)

这两者共同构成了 Receive 命令的“请求-响应”完整流程。


✅ 二、NVMe-MI Receive 命令映射到 SQE(发送请求)

🔹 对照字段结构说明

NVMe-MI 字段 NVMe SQE 字段 说明
Message Header (0~3) CDW10 标准 NVMe-MI 消息头,包括类型、IC 位等
Opcode (4) CDW11 Byte 0 指示具体管理指令
Reserved (5~7) CDW11 Bytes 1–3 保留位,占位用
Mgmt Dword 0 (8~11) CDW12 命令特定的附加参数
Mgmt Dword 1 (12~15) CDW13 命令特定的附加参数
Request Data (可选) Data Buffer(由 DPTR 指向) 若命令需要附加参数
MIC(最后) 不使用 带内机制中无效,忽略

📌 注:CDW0–CDW9 是标准 NVMe Admin Command 字段(如 Opcode、NSID、MPTR、DPTR 等)


✅ 三、NVMe-MI 响应映射到 CQE(接收响应)

🔹 对照字段结构说明

NVMe-MI 响应字段 NVMe CQE 字段 说明
Message Header (0~3) 不映射 不出现在 CQE 结构中
Status (4) DW0 Byte 0 → TSTAT 映射到 CQE 的低字节
Mgmt Response (5~7) DW0 Bytes 1–3 → TNMRESP 映射到 CQE 的高 24 位
Response Data (8~N) 通过 Data Buffer 返回 放在由 DPTR 指向的内存中(读入 Host)
MIC 不使用 带内机制中忽略该字段

✅ 四、字段结构图解说明(简洁版)

🔹 发送方向:Host → Controller
+-----------+-----------+----------+------------------+
| Field     | Offset    | SQE 映射 | 内容              |
+-----------+-----------+----------+------------------+
| NMH       | 0–3       | CDW10    | 消息头            |
| OPC       | 4         | CDW11.0  | 管理操作码        |
| Reserved  | 5–7       | CDW11.1–3| 占位              |
| NMD0      | 8–11      | CDW12    | 命令参数          |
| NMD1      | 12–15     | CDW13    | 命令参数          |
| ReqData   | 16–N-1    | DataBuf  | 请求数据(可选)   |


🔹 接收方向:Controller → Host
+---------------------+----------+----------------------------+
| Field               | CQE 映射 | 内容                       |
+---------------------+----------+----------------------------+
| Status (Byte 4)     | DW0.0    | TSTAT(状态码)            |
| Mgmt Response       | DW0.1–3  | TNMRESP(响应数据)        |
| Response Data       | DataBuf  | 实际数据(如结构体内容)   |

🧠 五、核心对比:Send vs Receive

项目 Send Receive
数据方向 Host → Controller Controller → Host
数据含义 Request Data(参数) Response Data(响应)
CQE 状态 处理结果反馈 + TSTAT/TNMRESP 同上
DPTR 指向 Host 发数据用 Host 接收数据用
MIC 使用 均不使用 MIC 字段(带内禁用)

✅ 六、实战举例:获取 Port 信息

目标:通过 NVMe-MI 隧道读取某个 Port 的信息结构体

📤 第一步:发送命令(NVMe-MI Receive)

  • OPC:Get Data Structure
  • NMD0/NMD1:指定结构体 ID 和索引
  • DPTR:指向主机准备的接收缓冲区

📥 第二步:等待 CQE 响应

  • DW0 Byte0(TSTAT)= 0x00 → 成功
  • DW0 Byte1–3(TNMRESP)= 响应结构体类型/状态
  • Data Buffer = 填入的结构体内容

📌 总结

部分 要点
图中左侧 NVMe-MI Request → 映射到 SQE 各字段,数据写入
图中右侧 NVMe-MI Response → 响应状态进 CQE,响应数据写入 DPTR
CQE.DW0 是隧道化响应的关键,封装了 TSTAT 和 TNMRESP
Data Buffer 实际传输数据的主通道
MIC 带内机制中完全 不使用 MIC

我们接下来可以继续分析:

  • Figure 55:Receive 请求各字段与 SQE 的详细对照表
  • Figure 56:Receive 响应字段与 CQE 的详细对照表

是否继续?我也可以为 Send + Receive 绘制一张完整的 交互序列图(Sequence Diagram) 来帮助记忆。