NVMe 数据寻址方式
NVMe 协议支持物理区域内存页(Physical Region Page, PRP)和散集列表(ScatterGather List, SGL) 两种寻址模型, 基于 PCIe 的 NVMe 主要使用 PRP 寻址模型, 因此这里仅对 PRP 寻址模型进行分析。
PRP 寻址示意图如图 1 所示, NVMe 将主机端存储分为页的集合, PRP 条目是指向物理内存页面的指针。 PRP 被用作主机和存储设备之间的数据传输的散点收集机制, 实现了有效的无序数据传输。 一条 PRP 条目长度为 64 比特, 包括基本页地址和偏移量两个字段, 其中偏移量字段的长度取决于物理内存页大小。 一条 PRP 条目能够指向一个物理内存页大小的数据, 当数据量较大时, PRP 条目也可作为指向一个PRP 列表的指针。 每个 PRP 列表中最多包含内存页大小数量的 PRP 条目, 当需要更多的 PRP 条目时, PRP 列表的最后一个条目指向新的 PRP 列表。 PRP 具有内存页对齐的属性, 除了首条 PRP 条目可以带有偏移, 其余的 PRP 条目偏移字段必须为 0,保持内存页对齐状态。

图1 PRP寻址示意图
在 NVMe 提交指令条目中存在一个长度为 128 比特的数据指针字段, 该字段即包含了两个 PRP 条目, 分别命名为 PRP1、PRP2。 PRP1 常用作 PRP 条目指向数据传输地址, 由于 PRP 具有内存页对齐的属性, PRP2 根据数据传输长度以及 PRP1 的偏移确定类型。 PRP2 类型的确定方式如表 1 所示:
表1 PRP2 类型
相关视频demo见B站:搜用户名: 专注与守望
或链接:https://space.bilibili.com/585132944/upload/video