第4章 消息服务模型与控制原语 - 页码56
我们继续深入解读 NVMe Express® Management Interface Specification, Revision 2.0 第 57 页内容,这部分对两个关键的控制原语操作码进行了详细说明 —— Pause(暂停) 和 Resume(恢复)。同时也讨论了它们的影响、响应结构和与重放机制(Replay)相关的交互行为。以下是逐条深入解析,帮助你彻底理解其工作机制。
✅ 总览:控制原语的请求与响应机制
控制原语的处理和响应保证性
- 如果管理控制器向命令插槽发送多个控制原语(Control Primitives)而没有等待响应,只有最后一个控制原语及其响应能保证一定被处理,其它先前的可能:
- 不被处理
-
不返回响应
-
然而,控制原语的接收永远不会破坏先前控制原语的状态;响应要么完整传输,要么完全丢弃,不会出现“传输到一半”的情况。
✅ Tag 字段机制
- 每条控制原语都携带一个 Tag 字段,它是管理控制器定义的 唯一标识符,用于在响应中进行匹配。
- 管理端点必须 原样复制 请求中的 Tag 到响应中的 Tag 字段,这使得控制器能够将响应与其对应请求一一对应。
✅ Pause Control Primitive(暂停控制原语)
🔧 功能:
将 Pause Flag 设置为
1
,从而 暂停响应消息的发送(Command Message 和 AEM 的响应)。
- 这个暂停发生在 包边界(packet boundary),也就是不会在一个 MCTP 消息传输中间强行暂停,而是在整个消息包发送完后暂停。
- 控制原语的响应消息(Control Primitive Responses) 不受影响,即使 Pause Flag 为
1
,它们仍会正常发送。
⚠️ 特性说明:
- 多次 Pause 是允许的:即使当前已经处于 Pause 状态,接收到新的 Pause 请求也不会报错。
- CSI 位要求:
- 不使用,应设置为
0
。 - 如果设置为
1
,管理端点将返回 无效参数错误响应(Invalid Parameter Error Response),并通过 PEL 字段指出 CSI 位有问题。
🧾 CPSP 字段(Control Primitive Specific Parameter):
- 对于 Pause 操作,该字段为 保留字段(Reserved),不得使用。
🧾 Pause 成功响应(Figure 41):
Bit 位范围 | 含义 |
---|---|
15:02 | Reserved(保留) |
01 | 已废弃(Obsolete),但为了兼容 旧版 1.2 规范,必须设置为 1 |
00 | 同上,也必须设置为 1 |
✅ Resume Control Primitive(恢复控制原语)
🔧 功能:
将 Pause Flag 清除为
0
,使之前暂停的响应消息恢复传输。
⚠️ 特性说明:
- 即使管理端点当前已经是 Resume 状态(Pause Flag 已为 0),重复发送 Resume 也不会报错。
- CSI 位要求:
- 同 Pause,一样 必须为 0。
- 若设置为
1
,也会触发 Invalid Parameter Error Response,PEL 指示 CSI 位。
📦 Resume 后的行为细节:
- 管理端点会从 上一次暂停前“成功发送完的最后一个包”之后的包开始继续传输。
- 但如果最后那个包实际上没有被管理控制器收到,那么控制器将会检测到 “包序列号不连续”,并丢弃该响应消息。
🎯 推荐策略:重放机制配合使用
为了避免上述的包序列同步问题,管理控制器应当使用 Replay Control Primitive,并在其中指定: - Response Replay Offset 字段 - 以明确指定应从哪个包重新开始传输响应消息。
🔍 图示与行为示意
▶️ Pause-Resume 操作流程图简化示意:
[Command Response Pending]
│
▼
[Pause Primitive] (Pause Flag = 1)
│
▼
[Stop response transmission at packet boundary]
│
▼
... (Pause ongoing)
│
▼
[Resume Primitive] (Pause Flag = 0)
│
├─> Resume transmission at next packet
└─> Controller checks sequence continuity
└─> If mismatch → drop & issue Replay
✅ 总结重点
项目 | Pause | Resume |
---|---|---|
控制行为 | 设置 Pause Flag = 1 | 清除 Pause Flag = 0 |
暂停什么? | Command 和 AEM 的响应消息 | 重新恢复之前暂停的传输 |
不受影响 | 控制原语的响应仍可发送 | 控制原语的响应正常 |
多次处理 | 可重复发出,无报错 | 可重复发出,无报错 |
CSI 位 | 必须为 0 ,否则返回错误 |
同上 |
CPSP 字段 | 保留 | 保留 |
同步注意 | 无 | 建议搭配 Replay,确保包序号连续 |
如果你想继续分析 Abort / Get State / Replay 控制原语 的机制,我可以为你逐条解析操作流程、响应结构和适用场景。是否继续?