常州二建建设有限公司官方网站,洮南网站建设哪家好,营销策划方案公司,投资融资理财网站模板NVMe系统内存结构 - PRP与PRP List 1 为什么需要PRP2 PRP3 PRP List4 PRP寻址算法4.1 仅PRP1指向数据4.2 PRP1指向数据#xff0c;PRP2指向数据4.3 PRP1指向数据#xff0c;PRP2指向PRP List 本文属于《
NVMe协议基础系列教程》之一#xff0c;欢迎查看其它文章。 1 为什么… NVMe系统内存结构 - PRP与PRP List 1 为什么需要PRP2 PRP3 PRP List4 PRP寻址算法4.1 仅PRP1指向数据4.2 PRP1指向数据PRP2指向数据4.3 PRP1指向数据PRP2指向PRP List 本文属于《
NVMe协议基础系列教程》之一欢迎查看其它文章。 1 为什么需要PRP Host向SSD写入数据 Host如果想往SSD上写入用户数据需要告诉SSD写入什么数据写入多少数据以及数据源在内存中的什么位置这些信息包含在Host向SSD发送的Write命令中。每笔用户数据对应着一个叫做LBALogical 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数据所在内存位置
一是PRP (Physical Region Page)二是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的布局。
BitDescription63: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的偏移量都必须是0PRP List中的每个PRP Entry都是描述一个物理页。它们不允许有相同的物理页不然SSD往同一个物理页写入几次的数据导致先写入的数据被覆盖。
每个NVMe命令中有两个域PRP1和PRP2Host就是通过这两个域告诉SSD数据在内存中的位置或者数据需要写入的地址。 PRP1和PRP2有可能指向数据所在位置也可能指向PRP List。类似C语言中的指针概念PRP1和PRP2可能是指针也可能是指针的指针还有可能是指针的指针的指针。别管你包的有多严实根据不同的命令SSD总能一层一层的剥下包装找到数据在内存的真正物理地址。
下面是一个PRP1指向PRP List的示例 PRP1指向一个PRP ListPRP List位于Page 200页内偏移50的位置。SSD确定PRP1是个指向PRP List的指针后就会去Host内存中Page 200Offset 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指向PagePRP2未使用。 我们把PRP1的Offset考虑进来的话那就是 Data Length (Page Size - PRP1.Offset)
此时PRP1为非0PRP2应该为0可以作为assert条件以验证编码预期。
4.2 PRP1指向数据PRP2指向数据
当满足1 Page Data Length 2 Page时数据用1个Page无法容纳用2个Page才能容纳因此PRP1指向一个PagePRP2指向另一个Page。
PRP1.Offset可以为非0PRP2.Offset为0 我们把Offset考虑进来的话那就是 (Page Size - PRP1.Offset) Data Length (Page Size - PRP1.Offset Page Size)
此时PRP1为非0PRP2也为非0可以作为assert条件以验证编码预期。
4.3 PRP1指向数据PRP2指向PRP List
当满足Data Length 2 Page时数据用2个Page都无法容纳因此需要借助PRP ListPRP1指向一个PagePRP2指向另一个PRP List可以表示若干个Page。 我们把Offset考虑进来的话那就是 Data Length (Page Size - PRP1.Offset Page Size)
此时PRP1为非0PRP2也为非0可以作为assert条件以验证编码预期。
如何计算PRP List长度MPRP个数可以 M (Data Length - (Page Size - PRP1.Offset)) / Page Size 并且(Data Length - (Page Size - PRP1.Offset)) % Page Size 0。 参考文档
SSD NVMe核心之PRP算法蛋蛋读NVMe之三NVMe技术基础知识一种自主分离的NVMePRP获取加速方法与流程