第六章 NVMe 介绍

news2024/11/24 0:12:42

6.4 寻址双雄:PRP 和 SGL

    1. 主机往 SSD 写入用户数据

 

    2. 主机读取 SSD 上的用户数据

       在上面两个过程中,主机在与 SSD 的数据传输过程中,主机是被动的一方,SSD 是主动的一方。即,主机需要数据(读数据),是 SSD 主动把数据写入主机的内存中;主机写数据,是 SSD 主动去主机的内存中取数据,然后写入内存。   

       那么,SSD 是如何知道在哪里取数据的呢????其实,主机有两种方式来告诉 SSD 数据所在的内存位置。一种是 PRP(Physical Region Page,物理区域页);一种是 SGL(Scatter / Gather List,分散 / 聚集列表)。

  

  3. PRP

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

  4. SGL

        SGL(Scatter Gather List),是个链表,由一个或者多个 SGL段(Segment)组成,而每个SGL段又由一个或多个SGL描述符(Descriptor)组成。

        SGL描述符是SGL最基本的单元,描述了一段连续的物理内存空间:起始地址 + 空间大小。

        每个SGL描述符大小是16字节。

6.5 Trace 分析

      Trace:追踪。

      下图中,PCIe 和 NVMe 一起构成了一个完整的主机与 SSD 通信的协议。

       NVMe层中,有 64 字节的命令、16 字节的命令返回状态以及跟命令相关的数据;

      PCIe事务层中,有事务层数据包TLP。

为实现不同的目的,事务层中的 TLP 可以分为以下几种类型:

(1)Configuration Read / Write;

(2)I / O Read / Write;

(3)Memory Read / Write;

(4)Message;

(5)Completion。

注意:此处的 Completion 和 NVMe 层的 Completion 不是同一个东西,它们处于不同的层。PCIe 层的 Completion TLP,是对所有Non-Posted 型 TLP 的响应;NVMe 层的 Completion,是对每个 SQ 中的命令的响应。

        在 NVMe 命令处理过程中,PCIe 事务层基本只用 Memory Read / Write TLP 来为 NVMe 服务,不会用到其他类型的 TLP。

  1. 下面以主机发送一个 Read 命令为例,学习 PCIe 是如何服务的??完整的 Trace 如下:

(1)第一步,主机准备了一个 Read 命令给 SSD。主机把该命令准备好之后,会放到 SQ 中;

(2)第二步,主机通过写 SQ 的 Tail DB,通知 SSD 来取命令。PCIe 是通过一个 Memory Write TLP 来实现主机写 SQ 的 Tail DB 的。

        一个主机,下面可能连接着若干个 Endpoint(EP),该 SSD 只是其中一个 EP 而已,那么主机是怎么准确更新该 SSD 控制器中的 Tail DB 寄存器的呢?怎么寻址?

 (3)第三步,SSD 收到通知,去主机端的 SQ 中取指。SSD 通过向主机端发送一个 Memory Read TLP 到主机的 SQ 中取指,主机通过 Completion 的方式把命令数据返回给 SSD;

(4)第四步,SSD 执行主机发送的 Read 命令,把数据从闪存中读到缓存中,然后把数据传给主机;

        数据从闪存到缓存中,是 SSD 内部的操作,与 PCIe 和 NVMe 没有关系。

(5)第五步,SSD 一旦把数据返回给主机,就会认为命令处理完毕。之后,SSD 会往主机的 CQ 中返回状态。

        SSD 通过 Memory Write TLP 把完成状态信息写入到主机的 CQ 中。

(6)第六步,SSD 采用中断的方式告诉主机命令执行完毕,让主机去处理 CQ;

(7)第七步,主机收到中断后,主机处理相应的 CQ。

        这是主机端内部发生的事情,在 Trace 上捕捉不到这个过程

(8)第八步,主机处理完相应的 CQ,通过 Memory Write TLP 更新 SSD 端的 CQ 的 Head DB。

6.6 端到端数据保护,即 NVMe 的数据保护机制

    端到端:一端是主机的内存空间,一端是 SSD 的闪存空间。

    即,NVMe 中端到端的数据保护功能。

    需要保护的是用户数据。

    主机和 SSD 之间,数据传输的最小单元是逻辑块(Logical Block,LB)。

       数据从主机到闪存,首先要经过 PCIe 传输到 SSD 的控制器,然后控制器把数据写入闪存;

      主机想从闪存上读数据,首先要由 SSD 控制器从闪存上获取数据,然后经过 PCIe 把数据传送给主机。

       主机与 SSD 之间传输数据时,由于信道噪声的存在,可能会使数据出错。因此,为了保持数据的一致性,NVMe 提供了一个端到端的数据保护功能

  1. 元数据Meta Data

       除了逻辑数据块本身,NVMe 还允许逻辑数据块携带元数据,元数据可以起保护数据的作用。

       元数据有两种存在方式:

       (1)作为逻辑块的扩展,和逻辑块一起传输。

       (2)逻辑块与元数据分别传输。

   2. 元数据是如何保护逻辑数据块的???

        通过在逻辑数据块上携带下面的保护信息(Protection Information,PI)来保护逻辑数据块。

    其中, 

 

         1)主机向 SSD 写入数据,不带保护信息的情况

         2)主机向 SSD 写入信息,全程带保护信息的情况

         3)主机向 SSD 写入信息,半程带保护信息的情况

 

 

6.7 Namespace

      Namespace,简称 NS。

      NS 由主机创建和管理,每个 NS 是独立的,逻辑块大小可以不同,端到端的数据保护配置也可以不同。

      对一个 NVMe 子系统来说,除了包含若干个 NS,还可以有若干个 SSD 控制器。注意,不是说一个 SSD 控制器有多个 CPU,而是说一个 SSD 有好几个实现了 NVMe 功能的控制器。如,下图中的 NVMe 子系统包含了两个控制器,分别实现不同的功能(或相同的功能)。

       一个 NVMe 子系统,除了可以有若干个 NS 和若干个控制器,还可以有若干个 PCIe接口。

 

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/749606.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM重点整理

一、虚拟机架构图 二、类加载过程 类加载器的作用:负责把class文件加载到内存中 类加载过程: 加载: 通过类的全限定名获取此类的二进制字节流文件的编码结构---->运行时的内存结构内存中生成一个class对象 链接: 验证&#x…

LangChain大型语言模型(LLM)应用开发(五):评估

LangChain是一个基于大语言模型(如ChatGPT)用于构建端到端语言模型应用的 Python 框架。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互&#x…

【状态估计】基于UKF法、AUKF法、EUKF法电力系统三相状态估计研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【PHP面试题40】能够使HTML和PHP分离开使用的模板技术有哪些

文章目录 一、前言二、模板技术的好处三、常用的模板技术3.1 PHP模板引擎3.2 前端模板引擎3.3 前后端分离技术 四、Smarty模板使用演示4.1 在项目中引入Smarty模板引擎的文件4.2 引入Smarty.class.php文件4.3 创建一个Smarty对象4.4 变量定义4.5 创建一个Smarty模板文件4.6 绑定…

【C语言】念数字

问题描述: 输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。 输入格式: 输入在一行中给出一个整数, 如:1234。 提示:整数包括负数、零和正数。 输出格式: 在一…

【C语言】2-C 语言程序构建过程以及 C 语言的程序结构

1. 程序构建过程 1.1 什么是计算机语言 1.1.1 机器语言 计算机只能识别二进制,也就是说只能识别由 0 和 1 组成的指令。在计算机发展的初期,一般计算机的指令长度为 16,即用 16 个二进制数(0 或 1)组成一条指令,16 个 0 和 1 可以组成各钟排列组合。例如用 0011 1100…

Cyclo(RRRRRRR) , NP213 TFA,多肽合成,碱性侧链氨基酸

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ -----产品描述---- 环肽试剂Cyclo(RRRRRRR),属于7个精氨酸的多肽合成,碱性侧链氨基酸这些保护基在合成过程中稳定,无副反应,合成结束后可以完全定量的脱除。 -----试剂信息--…

基于C语言的学生成绩管理系统

(꒪ꇴ꒪ ),hello我是祐言博客主页:C语言基础,Linux基础,软件配置领域博主🌍快上🚘,一起学习!送给读者的一句鸡汤🤔:集中起来的意志可以击穿顽石!作者水平很有限,如果发现错误&#x…

jmeter命令行运行(非GUI形式)参数详解

目录 一、JMete执行方式 二、JMete非GUI运行优点 三、jmeter非GU运行参数 四、jmeter非GUI运行命令 4.1非GUI基本命令格式: 4.2非GUI并生成html报告基本命令格式 总结: 一、JMete执行方式 正常情况下我们会以有页面的方式打开jmeter编写接口&…

lvs使用

1.前言 LVS(Linux Virtual Server)是一个基于 Linux 内核的负载均衡器,用于分发网络流量和将请求转发给后端服务器。LVS 提供了多种负载均衡算法和转发模式,以满足不同场景和需求的负载均衡需求 2.lvs功能 LVS 提供了三种负载均…

React在Dva项目中创建并引用页面局部组件

这篇文章我们演示Dva中编写组件的方式 官方这里也特意强调了UI这个关键词 跟多是作为我们界面元素的组件 而不是页面路由 我们要单独做路由的组件肯定还是直接放在我们Dva项目的src下的routes目录下就好了 然后 我们看 项目 src下有一个 components 目录 一般我们做什么前端项…

连接区块链节点的 JavaScript 库 web3.js

文章目录 前言web3.js 介绍web3.js安装web3.js库模块介绍连接区块链节点向区块链网络发送数据查询区块链网络数据 前言 通过前面的文章我们可以知道基于区块链开发一个DApp,而DApp结合了智能合约和用户界面(客户端),那客户端是如…

TCP三次握手、数据传输与四次挥手

一、建立TCP连接 —— 三次握手 (1)客户端向服务端发送一个携带初始序列号的SYN包。 (2)服务端收到后将其加入到半连接队列,然后向客户端回复携带初始序列号的SYNACK包。 (3)客户端收到后再向服…

ModelAttribute用法详解

目录 官方解释 例子 使用场景1 使用场景2 场景3 官方解释 首先看一下官方文档上该注解的解释: 可以看到ModelAttribute可以用在参数上,也可以用在方法上: Can be used to expose command objects to a web view, using specific attribu…

ceph--cephFS的使用

ceph分布式存储—cephFS的使用 1、cephfs的概念 ceph FS 即 ceph filesystem,可以实现文件系统共享功能,客户端通过 ceph 协议挂载并使 用 ceph 集群作为数据存储服务器。 Ceph FS 需要运行 Meta Data Services(MDS)服务,其守护进程为 ceph-mds&#x…

【Unity面试篇】Unity 面试题总结甄选 |Unity渲染Shader相关 | ❤️持续更新❤️

前言 关于Unity面试题相关的所有知识点:🐱‍🏍2023年Unity面试题大全,共十万字面试题总结【收藏一篇足够面试,持续更新】为了方便大家可以重点复习某个模块,所以将各方面的知识点进行了拆分并更新整理了新…

怎样优雅地增删查改(六):按任意字段关键字查询

文章目录 实现应用测试 实现 定义按任意字段关键字查询过滤器(IKeywordOrientedFilter)接口,查询实体列表Dto若实现该接口,将筛选指定的目标字段(TargetFields)包含指定的关键字(Keyword&#…

软件开发的六大设计原则

我们常说软件开发要尽量具有良好的可扩展性,做到高内聚低耦合。那么究竟该如何实现呢?在面向对象软件设计领域有一系列大家所认可的设计原则,依据这些原则来设计软件,就可以让软件有很好的可扩展性,其中最重要的一条原…

发起投票平台投票吧网络投票平台网络投票平台

小程序投票活动如何做?很多企业在运营当中,都会通过投票活动来进行推广,从而达到吸粉、增加用户粘度等效果。而此类投票活动,通过小程序就可以实现,操作简单。 我们现在要以“青春大不同”为主题进行一次投票活动&…

扩展欧几里得 证明及应用代码(超详细,附带例题)

应用方面: 1.求解乘法逆元 2.求解(ax)%bc 即 a个x 模上b后得到c,其中满足条件的x的最小整数。[也可表示为axc(mod b)] 3.求解直线上的整点数 模板代码: 代码1: ll exgcd(ll a,ll b,ll &x,ll &a…