附录与参考资料 - 第453页
我们继续深入讲解《NVM Express® Base Specification, revision 2.0b》第 B.3 和 B.4 节,分别涵盖:
- Fused Compare + Write 操作完成阶段
- 异步事件请求(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 内存映射图,或者我们可以进入下一节内容分析。你想继续深入哪个方向?