第4章 消息服务模型与控制原语 - 页码72
太好了,我们现在来深入分析 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) 来帮助记忆。