NVMe系列专题之四:寻址模型PRP和SGL解析

本文详细介绍了NVMe中用于描述内存地址的PRP(Physical Region Page)和SGL(Scatter Gather List)模型。PRP记录物理页地址,适用于NVMe over PCIe,而SGL用于描述任意物理空间,主要用于NVMe over Fabric。内容包括PRP的物理页大小、PRP Entry结构以及PRP list的使用。同时,文章通过实例解析了PCIe Trace中的PRP list应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们现在讲的NVMe,主要是基于NVMe over PCIe展开的。在之前的文章中,我们提到了NVMe over PCIe系统中Host与Controller主要依靠PCIe TLPs(Memory Read/Wirte)进行信息的传递。

在之前的PCIe专题(PCIe系列专题之二:2.2 TLP事务处理方式解析)中,我们详细介绍Memory Read/Write TLP的处理方式。在这里就略过咯~

在Host与Controller之间有数据交互时,Controller会多次访问Host内存。比如执行NVMe Read/Write:

  • 当Host下发NVMe Write命令时,Host会先放数据放在Host内存中,然后通知Controller过来取数据。Controller接到信息后,会通过PCIe Memory Read TLP读取相应的数据,接着Host返回的PCIe Completion报文中会携带数据给Controller,最后再写入NAND中。

  • 当Host下发NVMe Read命令时,Controller先从NAND中读出相应数据,然后通过PCIe Memory Write TLP将数据写入Host内存中。

上述Read/Write均有访问Host内存进行数据交互,那么,问题来了:

  • NVMe Write时,Controller怎么知道数据在Host内存的具体位置?

  • NVMe Read时,Controller怎么知道要把数据写到Host内存中哪个位置?

不怕,NVMe给Host配备了两大"法宝":PRPSGL。这两个模型均可以帮助Host告

### NVMe PRP SGL 的概念与实现 #### 物理区域页 (PRP) 主机通过物理区域页(PRP, Physical Region Page)告知固态硬盘(SSD)数据所在的具体内存位置。PRP 是一种简单的线性地址映射机制,适用于较小的数据传输场景。当数据量较小时,可以直接使用单个 PRP 来描述整个缓冲区的位置[^1]。 对于较大的数据传输需求,则可能需要多个连续的 PRP 页面来覆盖完整的缓冲区范围。每个页面大小通常为 4KB 或者更大,具体取决于硬件平台的设计规格。如果传输的数据长度超过了单一 PRP 能够表示的最大限度,则会采用链表形式连接多个 PRP 实现更大数据集的传递[^2]。 ```c struct nvme_prp { uint64_t prp1; /* First physical page address */ uint64_t prp2; /* Second physical page address or pointer to next PRP list */ }; ``` #### 分散/聚集列表 (SGL) 随着 NVMe 协议版本升级至 1.1 及以上,在原有基础上增加了对分散/聚集列表(SGL, Scatter/Gather List)的支持。相比起 PRP 方式而言,SGL 提供了一种更加灵活高效的方式来处理不连续分布于内存中的数据片段集合。它允许将非连续存储单元组合成逻辑上的连续流来进行批量操作,从而提高了 I/O 效率并减少了 CPU 开销。 在实际应用中,SGL 结构可以由一系列条目组成,每一条记录着一段特定长度的数据块及其对应的物理地址偏移值。这种方式特别适合用于网络通信、文件系统等应用场景下的零拷贝技术实施以及高性能计算环境里大规模并发访问模式下优化磁盘读写性能的需求。 ```c struct nvme_sgl_descriptor { uint64_t addr; /* Memory address of the data segment */ uint32_t length; /* Length of this segment in bytes */ uint8_t type_flags; /* Type and flags information */ }; ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

古猫先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值