附录与参考资料 - 第453页
NVME2.0协议解读 1 min read

附录与参考资料 - 第453页

Blog Author

我们继续深入讲解《NVM Express® Base Specification, revision 2.0b》第 B.3 和 B.4 节,分别涵盖:

  1. Fused Compare + Write 操作完成阶段
  2. 异步事件请求(Asynchronous Event Request)机制及主机推荐处理流程

📦 CMD1(Write 命令)字段解析续完

你前面已经读到 CMD1 的设置要求,我们归纳 CMD1 的关键字段(需与 CMD0 一致):

字段 说明
NSID 与 CMD0 相同 同一命名空间
MPTR 可选 指向元数据缓冲区(若使用)
PRP1/PRP2 设置物理地址 指向写入数据的 PRP List(本例为 16 KiB)
CDW10–11 与 CMD0 相同 起始 SLBA(逻辑块地址)
CDW12.LR 0 全力使用错误恢复机制写入
CDW12.FUA 0 可写入缓存
CDW12.PRINFO 0 未启用端到端保护
CDW12.NLB 3h 共 4 个逻辑块(4 KiB * 4)
CDW14–15 0 不使用保护信息

✅ 然后,主机需要一次性 Doorbell 提交整个 Compare + Write 命令对,确保控制器能够将其识别为一个不可分割的原子操作。


🧠 小结:Fused Operation 的应用意义

Compare + Write 典型用于数据库、日志系统等需要先比较再写入,且要求操作具备原子性 —— 若比较失败则不允许写入。这种机制本质上是对存储级并发控制的一种支持。


⚙️ B.4:Asynchronous Event Request 主机软件推荐行为详解

🔔 什么是 Asynchronous Event Request?

NVMe 控制器可以在后台触发异步事件,例如:

  • 电源失效预警
  • 温度过高
  • Spare 空间低于阈值
  • Sanitize 操作完成
  • 命名空间属性变化

主机通过异步事件请求(AER)机制接收这些事件,而无需轮询。


✅ 主机处理 AER 的推荐流程

假设主机发送了 n 个 AER 命令,当其中一个完成后,应按照以下步骤处理:

步骤 1:禁用触发该 AER 的事件

  • 如果事件来源的 Log Page 可被禁用(通过 Asynchronous Event Configuration 特性控制):
  • 发送 Set Features 命令禁用该类事件上报
  • 等待该命令完成(防止 race condition)

步骤 2:获取详细信息

  • 使用 Get Log Page 命令获取指定 Log Page 的详细内容
  • 等待获取完成

步骤 3:分析 Log Page 内容

  • 如果该事件是 非持续性(例如某个温度峰值),可重新开启事件上报;
  • 如果是 持续性(例如 spare 阈值不足),可继续禁用该类事件,直到条件消除

步骤 4:补发 AER 命令

  • 向控制器重新发送一个 AER 请求,保持系统中有 n 个活跃 AER(推荐数量可配置)

步骤 5(可选):恢复事件上报

  • 如果之前禁用了事件上报并希望后续继续接收,可再次 Set Features 启用对应事件位

🧠 小提示

  • 异步事件的目的在于“及时感知状态变化”,而不是依赖 Get Log 轮询;
  • 通常系统上电或初始化后,会预先发送多个 AER 命令,类似如下伪代码:
for (int i = 0; i < 4; i++) {
    submit_async_event_request(controller);
}

🪄 总结本节重点

概念 说明
Fused Operation 原子性 Compare + Write 操作,需使用连续命令 + FUSE 标志
PRP List 支持多页内存映射,用于大数据操作
AER 异步事件通知机制,避免轮询,节省资源
主机行为 获取日志、条件判断、重新配置事件开关和补发 AER

如果你需要,我可以为你画出 AER 流程图或者 PRP List 内存映射图,或者我们可以进入下一节内容分析。你想继续深入哪个方向?