原文来自https://cloud.tencent.com/developer/article/1458759,前两个章节解释了总体框架和命令分析。
NVMe学习之一:为什么SSD需要NVMe?
NVMe学习之二:细品SQ/CQ/DB
可乐学习NVMe之四:粗茶淡饭NameSpace
接下来我们继续看NVMe数据处理方式:
即我是data, 我从Host来,要到SSD去,或者我从SSD来,要去到Host中去。

Host --> SSD Write Data:

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

Host <-- SSD Read Data:

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去你内存中什么地方取用户数据,Host也有两种方式来告诉SSD数据所在内存位置,一是PRP (Physical Region Page, 不是P2P!),二是SGL (Scatter/Gather List)。

1. PRP

NVMe把Host的内存划分为一个一个页(Page),页的大小可以是4KB,8KB,16KB… 128MB。

PRP是什么,长什么样呢?

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

PRP Entry描述的是一段连续的物理内存的起始地址。如果需要描述若干个不连续的物理内存呢?那就需要若干个PRP Entry。把若干个PRP Entry链接起来,就成了PRP List。

是的,正如你所见,PRP List中的每个PRP Entry的偏移量都必须是0,PRP List中的每个PRP Entry都是描述一个物理页。它们不允许有相同的物理页,不然SSD往同一个物理页写入几次的数据,导致先写入的数据被覆盖。

Admin命令的数据地址只能采取PRP的方式,I/O命令的数据地址既可以采取PRP的方式,又可以采取SGL的方式。Host在命令中会告诉Controller采用何种方式。具体来说,如果命令当中DW0[15:14]是0,就是PRP的方式,否则就是SGL的方式。

每个NVMe命令中有两个域:PRP1和PRP2,Host就是通过这两个域告诉SSD数据在内存中的位置或者数据需要写入的地址。

PRP1和PRP2有可能指向数据所在位置,也可能指向PRP List。类似C语言中的指针概念,PRP1和PRP2可能是指针,也可能是指针的指针,还有可能是指针的指针的指针。别管你包的有多严实,根据不同的命令,SSD总能一层一层的剥下包装,找到数据在内存的真正物理地址。SSD善解人衣。

下面是一个PRP1指向PRP List的示例:

PRP1指向一个PRP List,PRP List位于Page 100,页内偏移20的位置。SSD确定PRP1是个指向PRP List的指针后,就会去Host内存中(Page 100,Offset 20)把PRP List取过来。获得PRP List后,就获得数据的真正物理地址,SSD然后就会往这些物理地址读入或者写入数据。

对Admin命令来说,它只用PRP告诉SSD内存物理地址;对I/O 命令来说,除了用PRP,Host还可以用SGL的方式来告诉SSD数据在内存中写入或者读取的物理地址。

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

2. SGL

SGL是什么?SGL是一个数据结构,用以描述一段数据空间,这个空间可以是数据源所在的空间,也可以是数据目标空间。SGL(Scatter Gather List)首先是个List,是个链表,由一个或者多个SGL Segment组成,而每个SGL Segment又由一个或者多个SGL Descriptor组成。SGL Descriptor是SGL最基本的单元,它描述了一段连续的物理内存空间:起始地址+空间大小。

每个SGL Descriptor大小是16字节。一块内存空间,可以用来放用户数据,也可以用来放SGL Segment,根据这段空间的不同用途,SGL Descriptor也分几种类型。

有4种SGL Descriptor:

  • 一种是Data Block,就是描述的这段空间是用户数据空间;
  • 一种是Segment描述符。
  • SGL Bit Bucket它只对Host读有用,用以告诉SSD,你往这个内存写入的东西我是不要的。

SGL不是由SGL Segment组成的链表吗?既然是链表,前面一个Segment就需要有个指针指向下一个Segment,这个指针就是SGL Segment描述符,它描述的是它下个Segment所在的空间。特别地,对链表当中倒数第二个Segment,它的SGL Segment描述符我们把它叫做SGL Last Segment描述符。它本质还是SGL Segment描述符,描述的还是SGL Segment所在的空间。为什么需要把倒数第二个SGL Segment描述符单独的定义成一种类型呢?我认为是让SSD在解析SGL的时候,碰到SGL Last Segment描述符,就知道链表快到头了,后面只有一个Segement了。

说了这么多,可能有点晕,举个例子:

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

无论是PRP还是SGL,本质都是描述内存中的一段数据空间,这段数据空间在物理上可能连续的,也可能是不连续的。Host在命令中设置好PRP或者SGL,告诉SSD数据源在内存的什么位置,或者从闪存上读取的数据应该放到内存的什么位置。

大家也许跟我有个同样的疑问,那就是,既然有PRP,为什么还需要SGL?事实上,NVMe1.0的时候的确只有PRP,SGL是NVMe1.1之后引入的。看看SGL和PRP有什么不同。

  1. SGL不仅提供了一个内存基地址,还提供了该段内存的大小信息(length),PRP只提供了一个基地址,内存大小需要SSD根据命令上下文去猜;
  2. SGL可描述任意的内存空间,相对PRP来说更灵活,后者基本按页访问内存;
  3. 另外SGL提供了一个Bit Bucket的东西,一段连续的LBA空间,其中的一些数据我可以不需要传输,PRP好像做不到这点。
    参考:
    https://cloud.tencent.com/developer/article/1458759

可乐学习NVMe之三:解读PRP/SGL相关推荐

  1. 可乐学习NVMe之二:三只熊SQ/CQ/DB

    本文是个人学习NVMe的一个总结,借鉴网络资料https://cloud.tencent.com/developer/article/1461928和个人实践经历一共分四篇阐述NVMe. 可乐学习NV ...

  2. 可乐学习NVMe之四:粗茶淡饭NameSpace

    可乐学习NVMe之一:为什么SSD需要NVMe 可乐学习NVMe之二:三只熊SQ/CQ/DB 可乐学习NVMe之三:解读PRP/SGL 1. 基本概念 从前文中我们知道,一个NVMe SSD系统主要分 ...

  3. [NVME协议8] 解读PRP/SGL

    声明 主页: 元存储的博客_CSDN博客 https://blog.csdn.net/vagrant0407?type=blog 本文依据公开知识及个人经验整理而成,如有错误请留言. 文章为个人辛苦整 ...

  4. linux系统管理学习笔记之三----软件的安装

    linux系统管理学习笔记之三----软件的安装 2009-12-29 19:10:02 标签:linux 系统管理 [推送到技术圈] 版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 ...

  5. Cookie 学习案例之三天免登录

    Cookie 问题:HTTP 协议是没有记忆功能的,一次请求结束后,相关数据会被销毁.如果第二次的请求需要使用相同的请求数据怎么办呢?难道是让用户再次请求书写吗? 解决:使用 Cookie 技术 解释 ...

  6. 软件学院学习体验之三

    软件学院学习体验之三 进了大学以后,时常感到非常劳累,特别是当时间不受自己支配的时候.虽说时间理应是由自己掌控的,但是一些额外的事情却往往影响着我的日程安排.往往是当我想着或是做着一些我认为相当重要的 ...

  7. SSD NVMe核心之PRP算法

    背景: 在近两年发现更多的NVMe控制芯片把Prp算法集成到NVMe IP中,Prp越来越对Firmware不可见了,这样对新的Firmware 工程师了解Prp很不友好. (之前有站在OS driv ...

  8. 一次递减代码matlab,DEA算法学习系列之三:一次性求解CCR模型所有DMU参数——效率、规模效益、有效性特征、调整值的matlab代码...

    <DEA算法学习系列之三:一次性求解CCR模型所有DMU参数--效率.规模效益.有效性特征.调整值的matlab代码>由会员分享,可在线阅读,更多相关<DEA算法学习系列之三:一次性 ...

  9. apollo学习基础之三[适配器adapter学习]

    apollo学习基础之三[适配器adapter学习] 目录 apollo学习基础之三[适配器adapter学习] 1.适配封装设计 2. AdapterManager的设计 3.总结归纳: 我们知道, ...

最新文章

  1. h5 rtmp推荐控件_H5播放Rtmp之videojs播放
  2. JAVA WEB之Spring4.x JdbcTemplate
  3. 使用Maven程序集创建漏洞评估工件
  4. Linux入门学习(十一)
  5. Fragment中设置监听返回键的功能
  6. java判断对象无数据_Java 判断实体对象及所有属性是否为空的操作
  7. Activiti6新特性
  8. springboot 整合springsecurity
  9. 【示波器专题】示波器探头的原理和分类
  10. 财务会计中会计科目的基础
  11. 修复下载后已发生损坏的压缩包(.rar)文件
  12. 计算机和网络之间有个感叹号,网络有个感叹号!电脑无线网络连接不上的几种常见问题...
  13. python 二进制与十进制之间的转换
  14. iOS- 网络访问JSON数据类型与XML数据类型的实现思路及它们之间的区别
  15. linux wifi6,WIFI6 基本知识(一)
  16. 【互动媒体】”十二个一“的文艺创作的文本分析与可视化
  17. 安装PHPStudy(小皮)V8.1最详细安装教程
  18. (一看就会)让VM虚拟机之间联网并能相互ping通
  19. mapbox加载天地图
  20. spring boot +ajax上传文件前后端分离完整实现示例代码

热门文章

  1. 1152 最大值和最小值
  2. BIOS知识枝桠——ACPI
  3. 马云布局健康快乐两年后,阿里体育CEO谈创业:小步快走,不抢“疯 口”
  4. 男人会等一个女人多久
  5. Kali入门到入狱-CC攻击
  6. js中的原型与原型链
  7. 计算机毕业设计Java智能化管理的仓库管理(源码+系统+mysql数据库+lw文档)
  8. 苹果手机查看python代码_[代码全屏查看]-基于Python的苹果序列号官网查询接口调用代码实例...
  9. 【PaperReading】OpenHGNN:An Open-Source Toolkit for Heterogeneous Graph Neural Networks
  10. 2022-2028全球及中国户外烟灰缸行业研究及十四五规划分析报告