NVMe PRP

目录

简介

详细描述

Offset

PRP List

Data Transfer(3 + 1 种方式)

create Non-Contiguous I/O SQ

相关配置

CC.MPS 内存页大小

MPSMAX 和 MPSMIN

Queue 相关设定

CAP.CQR 连续性要求

CDW11.PC

PRP1

Data Transfer 相关设定

PSDT 使能设定

PRP Entry 设定 DPTR

PRP1(位域 31:24)

PRP2(位域 39:32)

CMB 相关设定

PRP List 设定 LISTS

注意事项

Reference


简介

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 内存页大小

  1. physical memory page size 由 host 在“CC.MPS”中配置。即 Host 内存被划分为一个一个页,而页大小由 CC.MPS 决定。
  2. The size of the Offset field 由 CC.MPS 中配置的物理内存页面大小决定。
  3. CC 全称是 Controller Configuration。
  4. MPS 全称是 Memory Page Size,指的是 host memory page size,即描述了PRP entry size。
  5. 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。

  1. MPS 值必须设定在 CAP.MPSMAX 和 CAP.MPSMIN 的范围内。
  2. 该字段只有当 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)

不一定用到。

  1. 如果数据传输没有跨越 memory page boundary (取决于CC.MPS 和 Offset),则用不上 PRP2。
  2. 如果数据传输刚好跨越 memory page boundary,则 PRP2 指定第二个 page 的基地址。例如:
    1. 数据传输长度等于 1 个 memory page,同时 PRP1 的 Offset 不等于 0。
    2. 数据传输长度大于 1 个 memory page 且小于 2 个 memory page,同时 PRP1 的 Offset 等于0。
  1. 如果数据传输跨越多个 memory page boundary,则 PRP2 为 PRP List pointer。
    1. 数据传输长度大于等于 2 个 memory page,PRP1 的 Offset 不等于0。
    2. 数据传输长度大于 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值