NVMe协议详解(三)

  • 4.内存数据结构
    • 4.1 SQ与CQ的详细定义
      • 4.1.1 空队列
      • 4.1.2 满队列
      • 4.1.3 队列性质
    • 4.2 仲裁机制
      • 4.2.1 RR
      • 带有优先权的RR
      • 4.2.3 其他仲裁方式
    • 4.3 数据寻址方式(PRP和SGL)
      • 4.3.1 PRP
      • 4.3.2 SGL
      • 4.3.3 比较PRP与SGL

4.内存数据结构

4.1 SQ与CQ的详细定义

这里的SQ与CQ都是循环队列。

4.1.1 空队列

4.1.2 满队列

判断队列满可以有多种方法,协议中规定的是头指针比尾指针大一,所以队列满时,空余一个元素。

4.1.3 队列性质

  1. 队列大小有16bit,最小队列大小为2个元素(因为满队列的定义方式,所以最小为2个元素),对于I/O队列,最大队列大小为64k;对于Admin队列,最大队列为4k;
  2. QID来标识唯一ID,16bit,由host分配;
  3. host可以修改队列优先级(如果支持的话),共四级,U、H、M、L;

4.2 仲裁机制

4.2.1 RR

RR仲裁,Admin SQ与I/O SQ优先级相同,控制器每次可以选择一个队列中的多个命令(Arbitration Burst setting)。

带有优先权的RR

有3个严格的优先权,Priority1 > Priority2 > Priority3,在这三个优先级队列中,高优先级的队列中如果有命令,则优先执行(非抢占式)。

4.2.3 其他仲裁方式

Vendor Specific。

4.3 数据寻址方式(PRP和SGL)

4.3.1 PRP

NVMe把Host的内存分为页的集合,页的大小在CC寄存器中配置,PRP是一个64位的内存物理地址指针,结构如下:
最后两位为0,指四字节对齐;(n:2)位表示页内内偏移。
举个例子,内存页大小位4KB,则(11:2)表示页内偏移。
PRP寻址有两种方式,直接用PRP指针寻址,通过PRP List寻址。当使用PRP List寻址时,偏移必须为0h,每一个PRP条目表示一个内存页,如下:
Admin命令的数据地址只能采取PRP的方式,I/O命令的数据地址既可以采取PRP的方式,又可以采取SGL的方式。Host在命令中会告诉Controller采用何种方式。具体来说,如果命令当中DW0[15:14]是0,就是PRP的方式,否则就是SGL的方式。
命令的Dword6~Dword9只定义了PRP1、PRP2两个数据指针,通过PRP条目可以指向PRP List。如下图:

在上面的例子中,PRP1直接指向内存页,PRP2指向PRP List存在的地址,在PRP List中存有数据的真正的地址。

4.3.2 SGL

SGL是另外一种索引内存的数据结构。SGL由若干个SGL段组成,SGL段又由若干个SGL描述符组成,所以SGL描述符是SGL数据结构的基本单位。
目前定义的SGL描述符有6种:

  1. SGL 数据描述符,用来索引数据块地址,host内存;
  2. SGL 垃圾数据描述符,用来索引无用数据;
  3. SGL 段描述符,用来索引下一个SGL段;
  4. SGL 最后一个段描述符,用来索引最后一个SGL段;
  5. keyed SGL 数据描述符;
  6. Transport SGL 数据描述符;

在上面SGL例子中,共有3个SGL段,用到了4种SGL描述符。Host需要往SSD中读取13KB的数据,其中真正只需要11KB数据,这11KB的数据需要放到3个大小不同的内存中,分别是:3KB,4KB和4KB。

4.3.3 比较PRP与SGL

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

SGL和PRP本质的区别在于,一段数据空间,对PRP来说,它只能映射到一个个物理页,而对SGL来说,它可以映射到任意大小的连续物理空间,具有更大的灵活性,也能够描述更大的数据空间。如下图:

NVMe协议详解(三)相关推荐

  1. NVMe 协议详解(一)

    NVMe 协议详解 1. 综述 1.1名词解释 1.1.1 Namespace 1.1.2 Fused Operations 1.1.3 指令执行顺序 1.1.4 写单元的原子性 1.1.5 元数据 ...

  2. NVMe协议详解(二)

    NVMe协议详解(二) 2. PCIe寄存器配置 2.1 PCIe总线的基本结构 2.2寄存器配置 2.2.1 PCI header 2.2.2 PCI Capabilities 2.2.3 PCI ...

  3. MQTT协议详解 三、MQTT控制包(CONNECT)

    文章目录 系列文章目录 前言 CONNECT(客户端请求连接服务端) 一.固定包头(2字节) 二.可变包头(10字节) 协议名字(6字节) 协议等级(1字节) 连接标识(1字节) Clean Sess ...

  4. HTTPS协议详解(三):PKI 体系

    本文大部分内容摘自:http://www.wosign.com/faq/faq2016-0309-03.htm 尊重知识产权,转载注明Wosign -------------------------- ...

  5. NVMe协议详解(一)

    参考文档:NVME手册1.4a,下载网站. NVMe相关定义 queue pair 一对用来承载NVMe命令的队列对,由一个Submission Queue和一个Completion queue组成, ...

  6. EtherCAT设备协议详解三、EtherCAT CoE

    CoE 是 CANopen on EtherCAT, 在ethercat报文中封装CANopen协议 服务数据对象(SDO)用来访问CANopen对象字典条目的 关于canopen怎么封装到ether ...

  7. SSL/TLS协议详解(三)——证书颁发机构

    目录 证书颁发机构的需求 数字签名的定义 证书颁发机构的技术实现 如果攻击者篡改证书会怎样 信任链 数字签名的数学算法 浏览器如何实际验证给定服务器证书的有效性 TLS加密客户端-服务器通信并阻止中间 ...

  8. SRT协议详解三 传输参数

    4.1. 参数名称解析 这一节,我将逐个向大家介绍会影响SRT传输性能的参数名称,他们包括:Round Trip Time(RTT,往返延时).RTT Multiplier(RTT倍数).Packet ...

  9. AS2协议详解(三)

    AS2协议本身比较复杂,我们不需要了解其中太多细节,只需要知道一些重要概念就行了. AS2是基于HTTP/HTTPS的,消息的格式使用MIME,就是邮件的格式,使用SHA1或SHA2加RSA进行签名, ...

最新文章

  1. ICRA 2020 | 实时语义立体匹配
  2. 第十、十一周项目四 - 教师兼干部类
  3. libgdx使用android控件,在Android上使用libGDX中的SQLite
  4. 计算机电缆对绞节距,DJYPVP阻燃计算机电缆32/0.2芯数直径
  5. 在Ubuntu中搭建.NET开发环境
  6. 动态引用外部的Javascript脚本文件
  7. 分布式系统关注点(6)——「负载均衡」到底该如何实施?
  8. 前端生成小程序二维码
  9. 分布式事务之TCC事务
  10. dw常用标签_Dreamweaver制作基本标签
  11. python爬取豆瓣T250电影及保存excel(易上手)
  12. 【Java类的封装性】封装的日期类。Person类,使用对象作为成员变量并实现深拷贝。(利用了类的封装性)
  13. postgresql下载linux版本
  14. SQL 2008下载地址以及全新安装详细过程
  15. 百度统计之百度代码引用
  16. freeswitch实战六(呼叫转移)
  17. Git恢复已删除文件
  18. 磁盘分区MBR与GPT详解
  19. 【Prometheus】Prometheus 远端存储
  20. 火狐和IE之间的区别

热门文章

  1. Windows域环境使用教程实验
  2. KVM-2、虚拟化基础
  3. 本特利涡流式趋近式proximity位移传感器
  4. Android AVD创建及设置中各参数详解
  5. 在Windows 7下安装U871或U872,在检测组件窗口时,出现MDAC组没有安装的提示的解决办法...
  6. 达内学python_通过在达内学习python我的职场之路更加宽广了
  7. iphone开发设置横屏
  8. rtx android,RTX 腾讯通 | im.qq.com
  9. 困扰一周的配环境问题——RTX3090+CUDA11.1
  10. 如何重建深层神经网络的可塑性?