目录
简介
PRP,Physical Region Page,物理区域页,本质是一个 64 位内存物理地址。
A PRP entry 是一个指向 physical memory page 的指针。
PRPs 是一个用于 controller 和 host memory 之间数据传输的分散/收集机制,可实现高效的无序数据传输。
简单来说,PRP 就是一种寻址方式,告诉 SSD 去哪里取数据。同时也是 NVMe 规定的数据结构之一,约定了一种 controller 和 host 都能读懂的 data layout。
详细描述
一个 PRP entry Layout 被分为 2 部分:页起始地址(页基地址)、页内偏移。
如果 memory page size 是 4KiB,则 bits 11:00 是 Offset,可参考下图。如果是 8KiB,则 bits 12:00 为 Offset。
Offset
- 如果这个 entry 不是第一个 PRP entry 或是 PRP List 指针,则 Offset 都应该清 0。
- Offset 应该 4 byte aligned,即 bits 1:0 始终为 0。
-
- 但 controller 并没有被要求去检查 bits 1:0 必须为 00b。
- 如果 bits 1:0 并没有被清 0,则 controller 可以回报 error PRP Offset Invalid。
- 如果不回报 error,controller 应该把 bits 1:0 当成 00b 去操作。
PRP List
- a set of PRP entries。
- 描述了无法在一条命令中描述的其他 PRP entries。
- 一个 PRP List 中不存在重复的 PRP entry。即不允许有相同的物理页,不然会导致先写入的数据被覆盖。
- 传输数据量需要多个 PRP List 时,最后一个 PRP entry 指向下一个 PRP List。
- PRP List 中的 PRP entry 可以是物理上连续的,也可以是物理上不连续。
Data Transfer(3 + 1 种方式)
PRP entry,是指向 PRP 的一个指针。PRP entries 的 size 固定。
每个 NVMe 命令中有两个域,分别为 PRP1 和 PRP2 。host 通过它们告诉 SSD 数据所在位置。它们可能直接指向数据所在位置,也可能指向 PRP List。如何使用 PRP 1 和 PRP 2 呢?有 3 + 1 种算法。
- only PRP1:PRP1 is data address.
- PRP1 + PRP2:both data address.
- PRP1 + PRP2:PRP1 is data address. PRP2 is PRP List.
- PRP1 + PRP2:PRP1 is data address. PRP2 is PRP List List. (一般数据长度不会用到该种算法)
- 当 0 < data length < MPS - Offset,选择 only PRP1。
- 当 MPS - Offset < data length < MPS - Offset (即 PRP1 最大存储数据量) + MPS (即 PRP2 最大存储数据量),选择 PRP1 + PRP2,且两者均指向 data address。
- 当 MPS - Offset (即 PRP1 最大存储数据量) + MPS (即 PRP2 最大存储数据量)< data length,选择 PRP 1 + PRP2,但此时 PRP2 就指向 PRP List,便可以存储更多的传输数据。但为了保证硬件处理效率,PRP List 种的 PRP Offset 都为 0。
- 当数据超过 PRP List 所能描述的最大长度时,则 PRP2 被用于描述 PRP List 的 List。
如下图表示了其中一种算法, PRP1 + PRP2:PRP1 is data address. PRP2 is PRP List.
create Non-Contiguous I/O SQ
此时只用上了 PRP1,且 PRP 1 是一个 PRP List 指针。
相关配置
CC.MPS 内存页大小
- physical memory page size 由 host 在“CC.MPS”中配置。即 Host 内存被划分为一个一个页,而页大小由 CC.MPS 决定。
- The size of the Offset field 由 CC.MPS 中配置的物理内存页面大小决定。
- CC 全称是 Controller Configuration。
- MPS 全称是 Memory Page Size,指的是 host memory page size,即描述了PRP entry size。
- page size 范围:4KiB~128 MiB。
因为 page size = (2 ^ (12 + MPS)),
而 MPS 为 4 bit,MPS 范围是1~15,
2 ^ 12 = 4096 Byte
2 ^ (12 + 15) = 128 MiB。
- MPS 值必须设定在 CAP.MPSMAX 和 CAP.MPSMIN 的范围内。
- 该字段只有当 EN 被清 0 才能修改。
MPSMAX 和 MPSMIN
MPSMAX:host 不能设定 MPS 大于该值。
MPSMIN:host 不能设定 MPS 小于该值。
Queue 相关设定
CAP.CQR 连续性要求
bits 16 设定为 1 时,controller 要求 I/O SQ/CQ 都必须是物理连续的。同时 CDW11.PC 都必须设定为 1。
设定为 0 时,I/O SQ/CQ 可以是不连续的。
Figure 38: Offset 0h: CAP – Controller Capabilities
CDW11.PC
如果 CAP.CQR 为 1,但 CDW11.PC 被设为 0,则 controller 应该返回 error (Invalid Field in Command)。
如果 queue 是存放在 Controller Memory Buffer ……
PRP1
- 如果 CDW11.PC 设定为 1,则 PRP1 指向物理连续的 64 位内存地址。
- 如果 CDW11.PC 设定为 0,则 PRP1 则是一个 PRP List。即 I/O Queue 不连续。
Data Transfer 相关设定
PSDT 使能设定
PRP Entry 设定 DPTR
PRP1(位域 31:24)
- 在数据传输时,无论数据长度如何,PRP1 都是指向 data 的。
- 在 Create I/O Completion Queue 时,PRP1 是一个 PRP List pointer。详见前面章节(create Non-Contiguous I/O SQ)。
PRP2(位域 39:32)
不一定用到。
- 如果数据传输没有跨越 memory page boundary (取决于CC.MPS 和 Offset),则用不上 PRP2。
- 如果数据传输刚好跨越 memory page boundary,则 PRP2 指定第二个 page 的基地址。例如:
-
- 数据传输长度等于 1 个 memory page,同时 PRP1 的 Offset 不等于 0。
- 数据传输长度大于 1 个 memory page 且小于 2 个 memory page,同时 PRP1 的 Offset 等于0。
- 如果数据传输跨越多个 memory page boundary,则 PRP2 为 PRP List pointer。
-
- 数据传输长度大于等于 2 个 memory page,PRP1 的 Offset 不等于0。
- 数据传输长度大于 2 个 memory page,同时 PRP1 的 Offset 等于0。
CMB 相关设定
PRP List 设定 LISTS
如下 bit 位 置1,则 controller 支持 PRP Lists。
注意事项
Admin cmd,只用 PRP 告诉 SSD 内存物理地址。
I/O cmd,既用 PRP,也用 SGL(详见其他章节)。
Reference
NVM Express® Base Specification, Revision 2.0e