NVMe系统内存结构 - PRP与PRP List

本文详细解析了NVMe协议中的PRP(物理区域页)和PRPList的概念,介绍了为何需要这些机制,以及如何通过PRP1和PRP2进行数据在内存中的地址指示。重点讨论了PRP寻址算法,包括不同数据长度情况下PRP的使用策略,有助于理解NVMe存储设备的数据传输过程。
摘要由CSDN通过智能技术生成


本文属于《 NVMe协议基础系列教程》之一,欢迎查看其它文章。

1 为什么需要PRP

在这里插入图片描述

  • Host向SSD写入数据
    Host如果想往SSD上写入用户数据,需要告诉SSD写入什么数据,写入多少数据,以及数据源在内存中的什么位置,这些信息包含在Host向SSD发送的Write命令中。每笔用户数据对应着一个叫做LBA(Logical Block Address)的东西,Write命令通过指定LBA来告诉SSD写入的是什么数据。对NVMe/PCIe来说,SSD收到Write命令后,通过PCIe去Host的内存数据所在位置读取数据,然后把这些数据写入到闪存中,同时得到LBA与闪存位置的映射关系。

  • Host从SSD读取数据
    Host如果想读取SSD上的用户数据,同样需要告诉SSD需要什么数据,需要多少数据,以及数据最后需要放到Host内存的哪个位置上去,这些信息包含在Host向SSD发送的Read命令中。SSD根据LBA,查找映射表,找到对应闪存物理位置,然后读取闪存获得数据。数据从闪存读上来以后,对NVMe/PCIe来说,SSD会通过PCIe把数据写入到Host指定的内存中。这样就完成了Host对SSD的读访问。

在上面的描述中,大家有没有注意到一个问题,那就是Host在与SSD的数据传输过程中,Host是被动的一方,SSD是主动的一方。你Host需要数据,是我SSD主动把数据写入到你的内存中;你Host写数据,同样是我SSD主动去你Host的内存中取数据,然后写入到闪存。SSD跟快递小哥一样辛劳,不仅送货上门,还上门取件。

无论送货上门,还是上门取件,你都需要告诉快递小哥你的地址,不然茫茫人海,快递小哥怎么就能找到你呢?同样的,Host你不亲自传输数据,那总该告诉我SSD去你内存中什么地方取用户数据,或者要把数据写入到你内存中的什么位置。你在告诉快递小哥送货地址或者取件地址时,会说XX路XX号XX弄XX楼XX室,也可能会说XX小区XX楼XX室,anyway,快递小哥能找到就行。Host也有两种方式来告诉SSD数据所在内存位置:

  1. 一是PRP (Physical Region Page)
  2. 二是SGL (Scatter/Gather List)

2 PRP

NVMe把Host的内存划分为一个一个页(Page),页的大小可以是4KB,8KB,16KB… 128MB。物理内存页面大小,由主机软件在“CC.MPS”中配置。

Physical Region Page (PRP),PRP是指向物理内存页(Page)的指针。
下图,显示了由Page Base Address和Offset组成的PRP的布局。
在这里插入图片描述

BitDescription
63:02Page Base Address and Offset (PBAO):该字段表示,64位物理内存页地址。该字段的较低几位(n:2),表示内存页中的偏移量Offset。Offset字段的大小,由CC.MPS中配置的物理内存页面大小决定。
- 如果内存页大小是4KB,则Offset为11:02位;
- 如果内存页大小是8KB,则Offset为12:02,以此类推。
01:00保留

PRP本质就是一个64位内存物理地址,只不过把这个物理地址分成两部分:页起始地址Page Base Address和页内偏移Offset。最后两bit是0,说明PRP表示的物理地址,只能四字节对齐访问。

在这里插入图片描述
页内偏移可以是0,也可以是个非零的值。

  • 命令的第一个PRP的Offset,可以不为0;
  • 如果一个PRP指向PRP List,那么该PRP的Offset,也可以不为0;
  • 此外,其他PRP的Offset,必须为0。

3 PRP List

PRP Entry描述的是,一段连续的物理内存的起始地址。如果需要描述若干段不连续的物理内存呢?那就需要若干个PRP Entry。把若干个PRP Entry链接起来,就成了physical region page list (PRP List)。
在这里插入图片描述
PRP List中的每个PRP Entry的偏移量都必须是0,PRP List中的每个PRP Entry都是描述一个物理页。它们不允许有相同的物理页,不然SSD往同一个物理页写入几次的数据,导致先写入的数据被覆盖。

每个NVMe命令中有两个域:PRP1和PRP2,Host就是通过这两个域告诉SSD,数据在内存中的位置或者数据需要写入的地址。
在这里插入图片描述
PRP1和PRP2有可能指向数据所在位置,也可能指向PRP List。类似C语言中的指针概念,PRP1和PRP2可能是指针,也可能是指针的指针,还有可能是指针的指针的指针。别管你包的有多严实,根据不同的命令,SSD总能一层一层的剥下包装,找到数据在内存的真正物理地址。

下面是一个PRP1指向PRP List的示例:
在这里插入图片描述
PRP1指向一个PRP List,PRP List位于Page 200,页内偏移50的位置。SSD确定PRP1是个指向PRP List的指针后,就会去Host内存中(Page 200,Offset 50)把PRP List取过来。获得PRP List后,就获得数据的真正物理地址,SSD然后就会往这些物理地址读入或者写入数据。

如果需要更多的PRP List页,则PRP List页的最后一个条目,是指向下一个PRP List页的指针。
PRP条目的总数,由命令参数和内存页大小暗示。

4 PRP寻址算法

由于一个PRP可能指向数据,也可能指向PRP List,因此,我们可以根据传输数据长度Data Length,来计算出2个PRP的内存指向情况。主要有三种情况:

  • 仅PRP1指向数据;
  • PRP1指向数据,PRP2指向数据;
  • PRP1指向数据,PRP2指向PRP List。

在这里插入图片描述

4.1 仅PRP1指向数据

当满足Data Length <= 1 Page时,数据可以用一个Page Size容纳,因此仅需PRP1指向Page,PRP2未使用。
在这里插入图片描述
我们把PRP1的Offset考虑进来的话,那就是:
Data Length <= (Page Size - PRP1.Offset)

此时PRP1为非0,PRP2应该为0,可以作为assert条件,以验证编码预期。

4.2 PRP1指向数据,PRP2指向数据

当满足1 Page < Data Length <= 2 Page时,数据用1个Page无法容纳,用2个Page才能容纳,因此PRP1指向一个Page,PRP2指向另一个Page。
在这里插入图片描述

PRP1.Offset可以为非0,PRP2.Offset为0
我们把Offset考虑进来的话,那就是:
(Page Size - PRP1.Offset) < Data Length <= (Page Size - PRP1.Offset + Page Size)

此时PRP1为非0,PRP2也为非0,可以作为assert条件,以验证编码预期。

4.3 PRP1指向数据,PRP2指向PRP List

当满足Data Length > 2 Page时,数据用2个Page都无法容纳,因此需要借助PRP List,PRP1指向一个Page,PRP2指向另一个PRP List,可以表示若干个Page。
在这里插入图片描述
我们把Offset考虑进来的话,那就是:
Data Length > (Page Size - PRP1.Offset + Page Size)

此时PRP1为非0,PRP2也为非0,可以作为assert条件,以验证编码预期。

如何计算PRP List长度M(PRP个数),可以:
M = (Data Length - (Page Size - PRP1.Offset)) / Page Size
并且(Data Length - (Page Size - PRP1.Offset)) % Page Size == 0。


参考文档:

  • 19
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: NVMe(Non-Volatile Memory Express)是一种基于PCIe总线的高性能存储接口标准。NVMe SCSI(Small Computer System Interface)是在NVMe基础上将SCSI命令映射到NVMe的一种实现方式。 NVMe SCSI是一种在NVMe存储设备上执行SCSI命令的协议。其中,NVMe SCSI Primary Commands - 5是一组用于执行传输数据、控制设备和查询设备信息的SCSI命令。 这组命令包括读取命令(Read Command)、写入命令(Write Command)、写入长命令(Write Long Command)、写入同步命令(Write Synchronization Command)和预取命令(Prefetch Command)。 读取命令用于从存储设备中读取数据。可以通过设置数据传输长度和传输起始位置来指定需要读取的数据范围。 写入命令用于向存储设备中写入数据。与读取命令类似,可以设置数据传输长度和传输起始位置来指定写入的数据范围。 写入长命令用于写入长数据。相比于写入命令,写入长命令支持更大的数据传输长度。 写入同步命令用于在写入数据之前先进行一个或多个同步确认。这样可以确保之前的所有写入操作都完成后再进行下一个写入操作。 预取命令用于指定设备预取机制的信息,以优化读取性能。 总之,NVMe SCSI Primary Commands - 5是一组在NVMe设备上执行SCSI命令的指令集,用于实现数据读取、写入、同步和预取等操作,提供了高性能和效率的存储访问方式。 ### 回答2: NVMe(Non-Volatile Memory Express)是一种高性能存储接口协议,它的SCSI(Small Computer System Interface)主要命令集中的第5个命令被称为NVMe SCSI Primary Command - 5。 具体而言,NVMe SCSI Primary Command - 5是用于完成与NVMe设备通信的主要命令之一。它允许主机与NVMe设备之间进行读写操作,以获取或修改存储在设备上的数据。 通过进行读取操作,NVMe SCSI Primary Command - 5命令可以传输存储在NVMe设备中的数据到主机中。这对于从存储设备中获取文件和信息非常有用。主机可以指定读取的起始地址和读取的数据长度,以确保获取正确的数据。 与读取操作相反,NVMe SCSI Primary Command - 5也支持写入操作。主机可以将数据写入NVMe设备,以便在存储中创建、修改或更新文件和信息。通过指定写入的起始地址和写入的数据长度,主机可以确保写入正确的位置和适当的数据。 总的来说,NVMe SCSI Primary Command - 5命令是与NVMe设备通信的关键命令之一。它通过读取和写入操作,允许主机与NVMe设备之间高效地传输数据。 ### 回答3: NVMe SCSI primary commands - 5,是指NVMe(Non-volatile Memory Express)SCSI(Small Computer System Interface)主要命令的第五个版本。 第五版的NVMe SCSI primary commands扩展了之前版本的功能,提供了更高的性能和更丰富的功能支持。这些命令是用于与NVMe设备进行通信和控制的指令集。 NVMe是一种针对固态存储器(SSD)的高速、低延迟、高吞吐量的连接协议。SCSI是一种通用的存储设备接口,用于连接计算机和外部存储设备。 NVMe SCSI主要命令-5包括了以下几个方面的功能: 1. 带宽管理:命令集提供了更灵活的带宽管理功能,可以根据需要灵活地分配和管理带宽资源,以最大程度地提高系统性能。 2. 多路径支持:命令集扩展了多路径支持的功能,使得在多条路径之间进行负载平衡和故障转移更加灵活和可靠。 3. 电源管理:命令集增加了更多的电源管理命令,以支持设备的低功耗状态和快速唤醒。 4. 安全性增强:命令集引入了更多的安全性增强功能,包括加密、数据完整性保护等,以保护存储数据的安全性。 5. 性能优化:命令集提供了更多的性能优化命令,包括请求队列管理、命令优先级管理等,以提高系统性能和响应速度。 总之,NVMe SCSI主要命令-5是为了更好地满足NVMe设备的高性能和高可靠性需求而设计的指令集。通过扩展功能和提供更多的控制能力,它可以提供更优秀的存储性能和多样化的应用场景支持。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

百里杨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值