第3章 物理层与MCTP传输 - 页码40
NVMe-MI 1 min read

第3章 物理层与MCTP传输 - 页码40

Blog Author

继续深入分析 NVMe-MI 消息的完整结构,我们现在重点聚焦在以下几个关键字段:


✅ 补充图 20 字段分析(续)

🔸 Byte 3 – 保留位

该字节是保留字节,规范中没有定义功能,所有设备应将其置为 0h,解析时忽略。


🔸 Bytes 4 ~ (N-1):Message Data (DATA)

这是 NVMe-MI 消息的实际负载区域,其格式依赖于:

  • 消息类型(由 Message Type 字段 NMIMT 决定);
  • 可能是:
  • 控制原语(如 Pause、Replay、Get State 等)
  • 命令(NVMe-MI、NVMe Admin、PCIe 命令)
  • AEM(异步事件消息)

这段内容是实际交互中最核心的部分,格式会在后续章节(比如第 4、5、6 章)详细定义。


🔸 字节 (N ~ N+3):Message Integrity Check (MIC)

这是一个 32-bit 的 CRC 校验值(4 个字节),用于验证整个 NVMe-MI 消息体是否被篡改或损坏。

是否包含 MIC 字段由 IC 位决定:

场景 IC 位 = 1 IC 位 = 0
Request Message (带外) ✅ 应包含 MIC 🚫 不应包含 MIC
Response Message / AEM (带外) ✅ 必须包含 MIC 🚫 不包含
所有消息(带内) 🚫 不包含 MIC(IC 固定为 0)

✅ MIC(消息完整性校验)机制

当启用校验(IC = 1)时,使用 CRC-32C(Castagnoli 多项式) 进行完整性保护。

规范采用了 Rocksoft™ CRC 算法模型,参数如下:

🔧 Figure 21: Rocksoft™ CRC 算法参数

参数
Name CRC-32C
Width 32 bits
Polynomial 0x1EDC6F41
Init 0xFFFFFFFF(初始值)
RefIn True(输入反转)
RefOut True(输出反转)
XorOut 0xFFFFFFFF(结果异或)
Check 0xE3069283(标准校验)

🚀 注意:这个 CRC 与 Linux kernel、zlib、Intel Slicing-by-8 等标准库中的 CRC32C 算法一致。


✅ MIC 示例使用流程(计算校验)

✅ 基本步骤:

  1. 准备完整的消息体:不包含 MIC 字段本身,从 Byte 0 ~ Byte (N-1)。
  2. 使用上述参数执行 CRC-32C 计算,结果为 4 字节(低字节优先)。
  3. 将该 CRC 附加为 MIC,作为最后 4 字节。

🔍 举例场景:

  • 带外 Request
  • 启用 IC;
  • 计算完整性校验,携带 MIC 字段;
  • 带外 Response 或 AEM
  • 必须有 MIC
  • 带内 Request/Response
  • IC = 0,禁止使用 MIC,因为内带机制假定底层传输可靠。

📌 小结:消息完整性机制在不同场景的作用

使用机制 IC(完整性位) MIC(是否携带) CRC 校验
Out-of-Band 请求 应设为 1 应携带 ✅ CRC-32C
Out-of-Band 响应 必须为 1 必须携带 ✅ CRC-32C
Out-of-Band AEM 必须为 1 必须携带 ✅ CRC-32C
In-Band 所有消息 固定为 0 不可携带 ❌ 不使用

如果你想,我可以:

  • ✍️ 编写一个 CRC32C 校验示例代码(Python、C 都行)
  • 📊 制作一张图表展示 NVMe-MI 消息完整结构
  • 🔍 分析接下来 §3.2 Out-of-Band 消息传输机制细节

你想优先深入哪一部分?我可以帮你精读并可视化所有技术细节。