声明

主页: 元存储的博客_CSDN博客

https://blog.csdn.net/vagrant0407?type=blog
本文依据公开知识及个人经验整理而成,如有错误请留言。
文章为个人辛苦整理,付费内容,禁止私自转载。


内容摘要

PCIe传输层作为NVMe最直接的服务者,不管你NVMe发给我的是命令,还是命令状态,还是用户数据,我统统帮你放进包裹,打包后交给下一层。

TLP 类型

  1. Configuration Read/Write

  1. I/O Read/Write

  1. Memory Read/write

  1. Message

  1. Completion

NVMe命令处理流程


前言

今天我又把这张图搬出来了。没错,它是《蛋蛋读NVMe之一》里面的第一张图。任何一种计算机协议,它都是采用这种分层结构的。下层总是为上层服务的。有些协议,上图所有的层次都有定义和实现,而有些协议,只定义了其中的几层。然而,要让一种协议能工作,它需要一个完整的协议栈,PCIe定义了下三层,NVMe定义了最上层,两者一拍即合,构成一个完整的Host与SSD通讯的协议。

PCIe与NVMe最直接接触的是传输层。在NVMe层,我们能看到的是64字节的命令,16字节的命令返回状态,以及跟命令相关的数据。而在PCIe的传输层,我们能看到的是TLP (Transaction Layer Packet)。还是跟快递做类比,你要寄东西,可能是手机,可能是电脑,不管是什么,你交给快递小哥,他总是把你要寄的东西打包,快递员看到的就是包裹,他根本不关心你里面的内容。PCIe传输层作为NVMe最直接的服务者,不管你NVMe发给我的是命令,还是命令状态,还是用户数据,我统统帮你放进包裹,打包后交给下一层,让数据链路层继续处理。

今天不打算深入讲解PCIe,这又是一个大的话题。SSD FANS可能后续会推出类似NVMe系列文章,来个PCIe系列的,大家可以期待一下。对PCIe,我们今天只关注传输层,因为它跟NVMe接触是最直接最亲密的。PCIe传输层传输的是TLP,它就是个包裹,一般由包头和数据组成,当然也有可能只有包头没有数据。NVMe传下来的数据都是放在TLP的数据部分的(Payload)。为实现不同的目的,TLP可分为以下几种类型:

  1. Configuration Read/Write

  1. I/O Read/Write

  1. Memory Read/write

  1. Message

  1. Completion

注意,这个Completion跟NVMe层的Completion不是同一个东西,他们处在不同层。在NVMe命令处理过程中,PCIe传输层基本只用Memory read/write TLP来为NVMe服务,其他TLP我们不用管。

Host发送一个Read命令,PCIe是怎么服务的?今天主要目的,就是结合NVMe命令处理流程,蛋蛋带着大家把下面这张图看懂,看看NVMe和PCIe的传输层发生了什么。

我靠,密密麻麻的,什么鬼东西?别急,蛋蛋带你一步一步把它看懂。

首先,Host准备了一个Read命令给SSD:

也许你对NVMe Read命令格式不是很清楚,说实话,我也不清楚,但从上图,我们还是能得到下面的信息: Host需要从起始LBA 0x20E0448(SLBA)上读取128个DWORD (512字节)的数据,读到哪里去呢?PRP1给出内存地址是0x14ACCB000。这个命令放在编号为3的SQ里 (SQID = 3),CQ编号也是3 (CQID = 3)。我觉得知道这些就够了。相信看了蛋蛋读NVMe系列的,刚才说的这些都应该能懂。

当Host把一个命令准备好放到SQ后,接下来步骤是什么呢?回想一下NVMe命令处理的八个步骤。

第二步就是:Host通过写SQ的Tail DB,通知SSD来取命令。

上图中,上层是NVMe层,下层是PCIe的传输层,这一层我们看到的是TLP。Host想往SQ Tail DB中写入的值是5。PCIe是通过一个Memory Write TLP来实现Host写CQ的Tail DB的。

一个Host,下面可能连接着若干个Endpoint,该SSD只是其中的一个Endpoint而已,那有个问题,Host怎么能准确更新该SSD Controller中的Tail DB寄存器呢?怎么寻址?其实,在上电的过程中,每个Endpoint的内部空间都会通过内存映射(memory map)的方式映射到Host的内存中,SSD Controller当中的寄存器会被映射到Host的内存,当然也包括 Tail DB寄存器。Host在用Memory Write写的时候,Address只需设置该寄存器在Host内存中映射的地址,就能准确写入到该寄存器。以上图为例,该Tail DB寄存器应该映射在Host内存地址F7C11018,所以Host写DB,只需指定这个物理地址,就能准确无误的写入到对应的寄存器中去。应该注意的是:Host并不是往自己内存的那个物理地址写入东西,而是用那个物理地址作为寻址用,往SSD方向写。否则就太神奇了,往自己内存写东西就能改变SSD中的寄存器值,那不是量子效应吗?我们的东西还没有那么玄乎。

NVMe处理命令的第三步:SSD收到通知,去Host端的SQ中取指。

PCIe是通过发一个Memory Read TLP到Host的SQ中取指的。可以看到,PCIe需要往Host内存中读取16个DWORD的数据。为什么是16 DWORD数据,因为每个NVMe命令的大小是64个字节。从上图中,我们可以推断SQ 3当前的Head指向的内存地址是0x101A41100?怎么推断来的?因为SSD总是从Host 的SQ的Head取指的,而上图中,Address就是0x101A41100,所以我们有此推断。

在上图中,SSD往Host发送了一个Memory Read的请求,Host通过Completion的方式把命令数据返回给SSD。和前面的Memory Write不同,Memory Read中是不含数据,只是个请求,数据的传输需要对方发个Completion。像这种需要对方返回状态的TLP请求,我们叫它Non-Posted请求。怎么理解呢?Post,有”邮政”的意思,就像你寄信一样,你往邮箱中一扔,对方能不能收到,就看快递员的素养了,反正你是把信发出去了。像Memory Write这种,就是Posted请求,数据传给对方,至于对方有没有处理,我们不在乎;而像Memory Read这种请求,它就必须是Non-Posted了,因为如果对方不响应(不返回数据)给我,Memory Read就是失败的。所以,每个Memory read请求都有相应的Completion。

NVMe处理命令的第四步:SSD执行读命令,把数据从闪存中读到缓存中,然后把数据传给Host。数据从闪存中读到缓存中,这个是SSD内部的操作,跟PCIe和NVMe没有任何关系,因此,我们捕捉不到SSD的这个行为。我们在PCIe接口上,我们只能捕捉到SSD把数据传给Host的过程。

从上图中可以看出,SSD是通过Memory write TLP 把Host命令所需的128个DWORD数据写入到Host命令所要求的内存中去。SSD每次写入32个DWORD,一共写了4次。正如之前所说,我们没有看到Completion,合理。

SSD一旦把数据返回给Host,SSD认为命令以及处理完毕,第五步就是:SSD往Host的CQ中返回状态。

从上图中可以看出,SSD是通过Memory write TLP 把16个字节的命令完成状态信息写入到Host的CQ中。

SSD往Host的CQ中写入后,第六步就是:SSD采用中断的方式告诉Host去处理CQ。

SSD中断Host,NVMe/PCIe有四种方式:Pin-based interrupt, single message MSI,multiple message MSI,和MSI-X。关于中断,具体的可以参看spec 第171页,有详细介绍,有兴趣的可以去看看。从上图中,这个例子中使用的是MSI-X中断方式。跟传统的中断不一样,它不是通过硬件引脚的方式,而是把中断信息和正常的数据信息一样,PCIe打包把中断信息告知Host。上图告诉我们,SSD还是通过Memory Write TLP把中断信息告知Host,这个中断信息长度是1DWORD。

Host收到中断后,第七步就是:Host处理相应的CQ。这步是在Host端内部发生的事情,在PCIe线上我们捕捉不到这个处理过程。

最后一步,Host处理完相应的CQ后,需要更新SSD端的CQ Head DB,告知SSD CQ处理完毕。

跟前面一样,Host还是通过Memory Write TLP更新SSD端的CQ Head DB。

从我们抓的PCIe trace(感谢山哥提供!!除此之外,在整个NVMe系列的写作过程中,经常向山哥取经,在这深表感谢,感谢无私的帮助与解惑!)上,我们从PCIe的传输层看到了一个NVMe Read命令是怎么处理的,看到传输层基本都是通过Memory Write和Memory Read TLP传输NVMe命令、数据和状态等信息;我们确实也看到了NVMe命令处理的八个步骤,蛋蛋没有欺骗大家。

上面举的是NVMe读命令处理,其他命令处理过程其实差不多,就不凑篇幅了。

最后,我再贴出完整Trace,相信,也希望大家不会再有一团乱麻的感觉。

[NVME协议8] : 从传输层看PCIE 和 NVME 交互相关推荐

  1. [固态硬盘协议 第3回] 你懂 PCIE 和 NVME是如何相依相恋?

    前言 固态硬盘中的王者,一说非PCIE 莫属,一说非NVME SSD 莫属. PCIE 和 NVME 因何而生? PCIE 和 NVME 的联系和区别? 本着对 PCIE 和 NVME 的好奇心,本文 ...

  2. 计算机网络4小时速成:网络安全,被动攻击,主动攻击,对称加密,公钥秘钥,数字签名,鉴别,网络层安全协议IPsec,传输层安全协议SSL,防火墙,入侵检测系统

    计算机网络4小时速成:网络安全,被动攻击,主动攻击,对称加密,公钥秘钥,数字签名,鉴别,网络层安全协议IPsec,传输层安全协议SSL,防火墙,入侵检测系统 2022找工作是学历.能力和运气的超强结合 ...

  3. 网络协议:网络层传输层

    目录 网络层 网络层首部 网络层首部--总长度 网络层首部--标识.标志 网络层首部--片偏移 网络层首部--生存时间 ping的几个用法 传输层 UDP UDP--数据格式 UDP--检验和(Che ...

  4. 带你一文看懂--应用层、传输层的协议,HTTP协议及实现,UDP和TCP的报文格式以及为什么3次握手和4次挥手

    网络基础:TCP/IP四层模型中的典型协议--理解网络通信的流程原理 应用层协议:负责应用程序之间的数据沟通 网络版计算器:客户端向服务端传递两个数字以及一个运算符,服务端收到数据进行解析得到数字与运 ...

  5. 【CyberSecurityLearning 22】传输层协议分析(TCP/UDP)

    目录 一.传输层协议: 1)TCP/IP协议族的传输层协议主要有两个: 2)TCP协议特点: 3)TCP报文段/封装 4)TCP包头分析: 5)TCP的三次握手建立连接 6)TCP的四次握手断开连接 ...

  6. 传输层协议(TCP/UDP)介绍

    一,TCP/IP协议族的传输层协议概况:  1,TCP:传输控制协议  2,UDP:用户数据报协议  二,TCP/UDP协议详解:  1,TCP  a.TCP是面向连接的,可靠的进程到进程通信的协议 ...

  7. 划重点 传输层协议 tcp三次握手和四次挥手

    文章目录 传输层的协议 1.TCP/IP协议组的传输层协议 2. TCP报文段 3.TCP建立连接的过程 3.2 TCP常用端口号及其功能 4.UDP协议 4.1 UDP报文的首部格式 4.2 UDP ...

  8. 传输层协议(TPC和UDP介绍)

    第五章.传输层协议介绍 文章目录 第五章.传输层协议介绍 一.TCP和UDP协议 二.TCP报文格式 三.TCP三次握手 四.TCP四次挥手 面试题1:为什么是三次握手而不是两次呢? 面试题2:为什么 ...

  9. 计算机网络传输层之SR协议

    系列文章目录 第二章计算机网络传输层之可靠数据传输之流水线机制与滑动窗口协议-Selective Repeat协议(SR协议) 计算机网络传输层之SR协议 系列文章目录 九.Selective Rep ...

最新文章

  1. STM32 中malloc实际调用
  2. python 拆分excel openpyxl_openpyxl(python操作Excel)
  3. 再见 Win10系统!下一代操作系统要来了!!
  4. sql oracle 自增长字段,在Oracle、MySQL、MS SQL Server中创设自动增长字段
  5. C语言高级编程:如何确定一个变量是有符号还是无符号数
  6. 计算机原理及应用课程,课程介绍
  7. bash删除文件中含指定内容的行
  8. 谈身份管理之进阶篇 - 快速了解从管理到治理的最佳方案
  9. 2021抖音电商商家经营方法论白皮书
  10. undefined reference to `jpeg_std_error(jpeg_error_mgr*)
  11. PTA20、字典合并 (10 分)
  12. 呼吁成立中国FreeType联盟
  13. 不错的 HttpHelper类 c#
  14. C语言编写学生管理系统
  15. 深度学习入门之二阶段小demo练习(持续更新系列)
  16. cad抛物线曲线lisp_AutoCAD上精确实现抛物线和双曲线
  17. 【基础】PHP变量及变量作用域
  18. Description Resource Path Location Type The project cannot be built until build path errors are reso
  19. 防火墙和上网行为管理组网中位置前后关系
  20. 杭州电子科技大学acm---2010

热门文章

  1. PyCharm安装教程、Anaconda安装配置教程(超级详细)
  2. NRRC handover有哪些关键点?
  3. python天天向上和天天向下代码解析_天天向上的力量python(举一反三)
  4. Linux command | network
  5. Jetpack之DataBinding,android蓝牙开发教程
  6. Cosplay美图爬取
  7. 【C语言】求等差数列前n项和
  8. dns服务器未响应 没网,dns服务器未响应解决方法
  9. 问下大家,chorme里用开发者工具看headers,点network标签然后刷新网页并没有headers选项,怎么破?...
  10. java.lang.IllegalStateException