持久内存与安全机制 - 第399页
我们继续深入分析 NVMe Base Specification 2.0b 中 第 8.13.5.10 节到 8.14 节 的内容,涵盖以下两个关键主题:
🔐 8.13.5.10:DH-HMAC-CHAP 消息与认证命令的映射
这一节主要说明了:DH-HMAC-CHAP 协议的各类消息是如何通过 NVMe 命令在 host 与 controller 之间交互的。
| 消息类型 | 发起方 | 映射到的 NVMe 命令 |
|---|---|---|
DH-HMAC-CHAP_Reply |
Host | Authentication Send |
DH-HMAC-CHAP_Success2 |
Host | Authentication Send |
DH-HMAC-CHAP_Challenge |
Controller | Authentication Receive |
DH-HMAC-CHAP_Success1 |
Controller | Authentication Receive |
➡️ 换句话说:
- 从主机发出的消息(Reply、Success2) 是通过
Authentication Send命令发送的; - 控制器发出的消息(Challenge、Success1) 是通过
Authentication Receive命令接收的。
这确保了 每个方向的认证协议消息通过标准命令进行承载和验证。
🧠 8.14 Persistent Memory Region(持久性内存区域 PMR)
这是一项高阶功能,定义了一块 具有持久性(Power-fail Safe)的 PCIe 内存区域,可用于数据交互、缓存、日志记录等用途。
🟨 基础概念
| 字段 | 说明 |
|---|---|
| PMR | Persistent Memory Region,持久性内存区域 |
| PMRS (CAP寄存器位) | 设置为 1 表示支持 PMR |
| PMRCAP | 控制器能力寄存器,表明是否支持将命令数据/元数据通过 PMR 传输 |
| PMRMSCU/PMRMSCL | 定义 PMR 在控制器地址空间中的范围 |
| PMRCTL.EN | 设置为 1 启用 PMR 功能 |
| PMRSTS.NRDY | 0 表示 PMR 已准备就绪,可读写 |
📦 支持的功能场景
- 将命令数据或元数据完整地放在 PMR 区域;
- 支持高频读写的低延迟场景(如写缓存、日志缓冲区);
- 可跨掉电/重启/控制器复位保留数据;
- 可用作持久化日志或 NVMe Target 实现的共享写入空间。
🔁 地址映射机制
| 地址空间 | 作用 |
|---|---|
| PCIe 地址空间 | Host 通过 BAR 寄存器访问 PMR |
| Controller 地址空间 | 控制器通过内部地址计算访问 PMR |
- 二者在偏移地址上一一对应;
- 控制器通过将
CMSE设为 1,启用 Controller 地址空间访问 PMR。
⚠️ 注意事项
- 在一次命令中,数据和元数据必须都在 PMR 中或都不在 PMR 中;
- 当
PMR未准备好时(NRDY = 1),Host 不应向其发送数据; - 数据持久性的实现方式是厂商自定义的,可能是:
- 实际写入非易失性存储;
- 写入非易失性写缓冲,稍后再落盘;
- 可选写弹性缓冲区(write elasticity buffer)允许 PCIe 写操作的突发吞吐量高于 PMR 实际写入能力;
- 可以缓存数据,后续慢慢写入持久介质。
🧮 写操作耗时计算公式
- 写
N字节所需时间 =N / Sustained Write Throughput - 弹性缓冲区耗尽时间 =
Elasticity Buffer Size / Sustained Write Throughput
可参考:
- PMR Sustained Write Throughput:见 3.1.3.26
- Elasticity Buffer Size:见 3.1.3.25
✅ 总结归纳
| 项目 | 说明 |
|---|---|
DH-HMAC-CHAP 消息映射 |
明确每条消息通过 Send 还是 Receive |
| PMR 启用 | 设置 PMRCTL.EN = 1,控制器准备后 PMRSTS.NRDY = 0 |
| PMR 特性 | 持久性、支持数据/元数据传输、掉电保护、跨 reset 保留 |
| 写吞吐机制 | 可配合弹性缓冲区,支持 burst 写入 |
| 持久机制实现 | 厂商自定义(落盘 / 缓冲) |
你接下来希望我继续解析:
- 8.15 Asymmetric Namespace Access(ANA 详细机制)?
- 还是深入分析 PMR 的实际应用场景 + 编程示例?
- 或者画一张图展示 PMR 的地址映射 + 吞吐时序?
你说了算 😎