nvme的PRP与SGL

一、PRP和SGL简介

  1. 主机也有两种方式来告诉SSD数据所在的内存位置:
    1. 一是PRP(Physical Region Page,物理区域页);
    2. 二是SGL(Scatter/Gather List,分散/聚集列表)。

二、PRP

  1. NVMe把主机端的内存划分为一个一个物理页(Page),页的大小可以是4KB、8KB、16KB…128MB。

  1. PRP条目本质就是一个64位内存物理地址,只不过这个物理地址被分成两部分--页起始地址和页内偏移。最后两位是0,说明PRP表示的物理地址只能4字节对齐访问。页内偏移可以是0,也可以是个非零的值,

三、PRP List

  1. 一个PRP条目描述的是一个物理页空间。如果需要描述若干个物理页,那就需要若干个PRP条
  2. 把若干个PRP条目连接起来,就成了 PRP 链表(List)。

  1. PRP链表中的每个PRP条目的偏移量都必须是0,PRP链表中的每个PRP条目都是描述一个物理页。它们不允许有相同的物理页,不然SSD往同一个物理页写入几次数据,会导致先写入的数据被覆盖。
  2. 每个NVMe命令中有两个域--PRP1和PRP2,主机就是通过这两个域告诉SSD数据在内存中的位置或者数据需要写入的地址,如表所示。

  1. PRP1和PRP2有可能指向数据所在位置,也可能指向PRP链表。类似C语言中的指针概念,PRPI和PRP2可能是指针,也可能是指针的指针,还有可能是指针的指针的指针。别管你包得有多严实,根据不同的命令,SSD总能一层一层地剥下包装,找到数据在内存的真正物理地址。
  1. 一个PRP1指向 PRP 链表的示例如图所示。
    1. PRP1指向一个PRP链表,PRP链表位于页200、页内偏移50的位置。SSD确定PRP1是个指向PRP链表的指针后,就会去主机内存中(Page200,0fset50)把PRP链表取过来。获得 PRP链表就获得数据的真正物理地址,SSD就会向这些物理地址读取或者写入数据。

  1. 对Admin命令来说,它只用PRP告诉SSD内存物理地址;对IO命令来说,除了用PRP,主机还可以用SGL的方式来告诉SSD数据在内存中写入或者读取的物理地址,如下表所示:

  1. 主机在命令中会告诉SSD采用何种方式。具体来说,如果命令当中的CDW0[15:14]是0,就是PRP的方式,否则就是 SGL的方式。

四、SGL

  1. SGL是什么?
    1. SGL(Scatter Gather List)是一个数据结构,用于描述一段数据空间,这个空间可以是数据源所在的空间,也可以是数据目标空间。SGL首先是一个链表由一个或者多个SGL(Segment)组成而每个SGL段又由一个或者多个SGL描述符(Descriptor)SGL描述符是SGL最基本的单元,它描述了一段连续的物理内存空间:起始地址+空间大小
  2. 每个SGL描述符大小是16字节。一块内存空间,可以用来放用户数据,也可以用来放SGL段,根据这段空间的不同用途,SGL描述符也分为几种类型,如下表

  1. 由表可知,有4种SGL描述符:
    1. 数据块描述符:它用于表明这段空间是用户数据空间。
    2. 段描述符:SGL是由SGL段组成的链表,既然是链表,前面一个段就需要有一个指针指向下一个段,这个指针就是SGL段描述符,它描述的是它下一个段所在的空间。
    3. SGL末段描述符:对链表当中倒数第二个段,它的SGL段描述符我们称之为SGL末段描述符。它本质还是SGL段描述符,描述的还是SGL段所在的空间。为什么需要把倒数第二个SGL段描述符单独定义成一种类型呢?目的是让SSD在解析SGL的时候,碰到SGL末段描述符,就知道链表快到头了,后面只有一个段了。
    4. SGL位桶描述符:它只对主机读有用,用于告诉SSD往这个内存写入的东西不是它要的,所以不用传了。

  1. 假设主机需要从SSD中读取13KB的数据,其中真正只需要11KB数据,这11KB的数据需要放到3个大小不同的内存中,分别是3KB、4KB和4KB。

  1. 论是PRP还是SGL,本质都是述内存中的一段数据空间,这段数据空间在物理上可能是连续的,

也可能是不连续的。主机在命令中设置好PRP或者SGL,并告诉SSD数据源在内存的什么位置,或者从闪存上读取的数据应该放到内存的什么位置。

  1. 那 SGL和PRP本质的区别在哪?PRP描述的是物理页,而SGL可以描述任意大小的内存空间。

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值