NVMe详解(四)

news/2024/11/13 4:22:45/

NVMe详解(四)

  • 5. NVMe协议定义的命令
    • 5.0 命令执行过程
    • 5.1 命令分类
    • 5.2 命令通用格式
    • 5.3Admin 指令
    • 5.4 NVM指令
  • 6 控制器结构
    • 6.1 命令执行过程
    • 6.2 重启(Reset)
      • 6.2.1 Controller level
      • 6.2.2 Queue level
    • 6.3中断
    • 6.4 Controller初始化
    • 6.5 host端命令实例
      • 6.5.1创建命令
      • 6.5.2处理完成命令
    • 6.6 NVMe与PCIe交互实例(分析包结构)——引用自SSDFans
  • 7. NVMe features
    • 7.1固件(Firmware)更新过程
    • 7.2元数据(Metadata)传输
    • 7.3 端到端的数据保护

5. NVMe协议定义的命令

5.0 命令执行过程

命令由host提交到内存中的SQ队列中,更新TDBxSQ后,NVMe控制器通过DMA的方式将SQ中的命令(怎么取,如何取,取多少,因设计而异)取到控制器缓冲区,执行命令;执行完成后,根据执行状态,组装完成命令,仍然通过DMA的方式将完成命令写入内存CQ的队列中;NVMe控制器通过MSI-X中断方式通知host已完成命令;最后,host处理CQ命令,更新控制器中HDBxCQ,标识着命令真正完成。

5.1 命令分类

命令分为Admin指令与NVM指令(I/O指令)。
Admin指令只能提交到Admin Controller中,主要负责管理NVMe控制器,也包含对NVM的一些控制指令。
NVM 指令只能提交到I/O Controller中,主要负责完成数据的传输。
在1.0e版本中,Admin指令有15条(3条与NVM相关),NVM指令有6条;在1.3d版本中,Admin指令有15条(3条与NVM相关),NVM指令有11条。

5.2 命令通用格式

命令均为64字节,具有相同的格式,某些字段根据命令的不同有不同的定义。

完成结果同样具有相同的格式,某些字段根据命令的不同有不同的定义。

5.3Admin 指令

Admin指令与NVM指令根据放置的的队列组(Queue Pair)来区分,Admin指令在Admin CQ与SQ里,NVM指令在I/O CQ与SQ里。
通过Dword0中的8位操作码定义不同指令,注意并不是绝对的顺序增加(eg,没有03h)。每一种指令都对应有其完成命令,通过SQID(提交队列ID)+CID(命令ID)唯一标识完成的命令。

5.4 NVM指令

NVMe控制器读写的最小单元是LB,层次图如下:

在这里插入图片描述

NVM指令与Admin指令结构完全相同,也是通过Dword0中的8位操作码来定义不同指令。

6 控制器结构

控制器从功能上可以分为三类,I/O、Admin和Discovery。

在这里插入图片描述
在实现过程中,Admin 控制器只有一个,负责管理控制器及其他控制功能。控制器只是抽象的概念,应用于具体的实现中,可能是一个具体的模块,也可能多个模块。
控制器主要的作用是实现对NVMe定义命令的翻译,从而实现数据传输、状态控制等功能。

6.1 命令执行过程

  1. host将命令(1条或者多条)写入提前分配好的SQ中;
  2. 更新对应SQ的DB寄存器;
  3. NVMe控制器取SQ中命令(通过HDB和TDB可以判断是否有未完成命令);
  4. NVMe控制器执行命令;
  5. NVMe 控制器在命令完成后,将完成命令(可能执行成功,也可能失败,但都会返回完成命令)写入host内存SQ对应的CQ中;
  6. NVMe 控制器根据实现的中断方式,提醒host命令已完成;
  7. host响应中断,处理完成命令;
  8. host 更新对应CQ的DB寄存器。

在这里插入图片描述

6.2 重启(Reset)

6.2.1 Controller level

Controller重启可能发生在PCIe总线重启、PCI重启、控制器CC.EN从1到0重启。当重启发生时:

  1. 所有的I/O SQ和CQ都被删除;
  2. 所有未完成的指令(Admin和I/O)应该执行撤销操作;
  3. Controller处于idele状态,CSTS.RDY清0;
  4. AQA、ASQ、ACQ不受影响。

重启后,host操作:

  1. 更新寄存器状态;
  2. 将CC.EN置1;
  3. 等待CSTS.RDY置1;
  4. 使用Admin命令配置Controller;
  5. 创建I/O CQ和SQ;
  6. 执行正常的I/O指令。

6.2.2 Queue level

队列水平的重启,即,删除该队列,再重新创建一个新队列。删除队列的时候,host应该保证队列处于idle状态(所有命令均已完成——接收到了完成命令),否则的话,可能会导致CQ接收不到提交命令的完成命令。

6.3中断

在Controller完成SQ命令后,根据执行状态,将结果组装成完成命令写入CQ中,Controller通过中断机制通知Host处理完成命令。
NVMe协议中支持的中断方式有4种,pin-based、Single MSI、Multi-message MSI和MSI-X,协议推荐采用MSI-X中断方式,能够支持更多的中断向量(2K)。
MSI-X允许每一个CQ发送自己的中断信息(相比于发一条中断信息提醒全部CQ队列有很大的优势)。在产生MSI-X中断信息前,需要检查该中断在相应寄存器种不被屏蔽。

6.4 Controller初始化

Controller的初始化过程:

  1. 设置PCI和PCIe寄存器;
  2. 等待CSTS.RDY变为;
  3. 配置AQA、ASQ、ACQ寄存器;
  4. 配置CC寄存器;
  5. 将CC.EN置1;
  6. 等待CSTS.RDY置1
  7. Host通过Identify命令,确定Controller的数 据结构、确定Namespace的数据结构;
  8. Host通过get features(协议中是set features,待研究)获取I/O SQ和CQ信息,然后配置中断机制;
  9. Host分配适当的I/O CQ、SQ队列;
  10. 如果Host希望获取Controller的错误或健康信息,可以添加异步事件请求命令。

Controller 关机
正常关机:

  1. Host停止提交新的I/O命令,但允许未完成的命令继续完成;
  2. Host删除所有I/O SQ,删除所有SQ队列后,所有未完成的命令将被撤销;
  3. Host删除所有I/O CQ;
  4. Host将CC.SHN置01b,表示正常关机;关机程序完成时,将CSTS.SHST置10b。

突然关机:

  1. Host停止提交新的I/O命令;
  2. Host将CC.SHN置10b,表示突然关机;关机程序完成时,将CSTS.SHST置10b

6.5 host端命令实例

6.5.1创建命令

在这里插入图片描述

6.5.2处理完成命令

在这里插入图片描述

6.6 NVMe与PCIe交互实例(分析包结构)——引用自SSDFans

以Host发出read命令为例。

  1. Host准备了一个Read命令给SSD:
    在这里插入图片描述分析该包,Host需要从起始LBA 0x20E0448(SLBA)上读取128个DWORD (512字节)的数据,读到哪里去呢?PRP1给出内存地址是0x14ACCB000。这个命令放在编号为3的SQ里 (SQID = 3),CQ编号也是3 (CQID = 3)

  2. Host通过写SQ的Tail DB,通知Controller来取命令
    在这里插入图片描述上图中,上层是NVMe层,下层是PCIe传输层的TLP。Host想往SQ Tail DB中写入的值是5。PCIe是通过一个Memory Write TLP来实现Host写CQ的Tail DB的。该Tail DB寄存器映射在Host的内存地址为F7C11018,由于NVMe 的寄存器映射到了Host内存中,所以可以根据这个地址写入寄存器值。

  3. SSD收到通知,去Host端的SQ中取指。
    在这里插入图片描述PCIe是通过发一个Memory Read TLP到Host的SQ中取指的。可以看到,PCIe需要往Host内存中读取16个DWORD的数据(一个NVMe指令大小),

  4. SSD执行读命令,把数据从闪存中读到缓存中,然后把数据传给Host:
    在这里插入图片描述
    SSD是通过Memory write TLP 把Host命令所需的128个DWORD数据写入到Host命令所要求的内存中去。SSD每次写入32个DWORD,一共写了4次。

  5. SSD往Host的CQ中返回状态:
    在这里插入图片描述SSD是通过Memory write TLP 把16个字节的命令完成状态信息写入到Host的CQ中。

  6. SSD采用中断的方式告诉Host去处理CQ:
    在这里插入图片描述
    上图使用的是MSI-X中断方式。这种方式将中断信息和正常的数据信息一样,PCIe打包把中断信息告知Host。SSD还是通过Memory Write TLP把中断信息告知Host,这个中断信息长度是1DWORD。

  7. Host处理相应的CQ

  8. Host处理完相应的CQ后,需要更新SSD端的CQ Head DB告知SSD处理
    完成:

在这里插入图片描述Host还是通过Memory Write TLP更新SSD端的CQ Head DB。
该过程完整的包流程如下:

在这里插入图片描述

7. NVMe features

7.1固件(Firmware)更新过程

  1. 将固件下载到Controller中(使用 Firmware Image Download命令);
  2. Host提交Firmware Activate命令(也可以激活之前版本的Controller镜像);
  3. Controller reset;
  4. reset完成后,Host重新初始化Controller,包括Host重新分配I/O队列,与reset步骤相同。

7.2元数据(Metadata)传输

元数据的使用并没有强制规定,最经常的使用方法是用做端到端数据的保护信息。有两种传输元数据的方式,一种可以作为LB数据块的一部分,如下图:

在这里插入图片描述另一种可以单独作为一个逻辑块传输,如下图:

在这里插入图片描述

7.3 端到端的数据保护

端到端,一端指主机的内存空间,一端指闪存空间(NVM)。数据传输的两个环节如下图:

在这里插入图片描述
数据在PCIe上传输的时候,由于信道噪声的存在(说白了就是存在干扰),可能导致数据出错;另外,Controller闪存之间,数据也可能发生错误。采用元数据进行数据的保护是最常用的一种手段。
充当保护数据角色的元数据结构如下:

在这里插入图片描述其中,Guard为16bit的CRC校验码,Application Tag与LBAT相关,Reference Tag将用户数据和地址(LBA)相关联。下图为以512bytes的数据块为例

在这里插入图片描述那么按照排列组合,共有四种保护情况(1带2带、1不带2不带、1带2不带、1不带2带)。但由于协议中控制保护信息的只有两个字段(1. 是否采用保护 2. PRACT位),只有三种3情况,如下4图(是以写命令为例,读命令相同):

在这里插入图片描述


http://www.ppmy.cn/news/432218.html

相关文章

EVE-NG(网工神器)硬盘扩容

1.EVE-NG介绍 EVE-NG(全称 Emulated Virtual Environment- Next Generation),继 Unetlab 1.0 后的 Unetlab 的 2.0 新版本,改了名字,原名是 Unified Networking Lab 统一网络实验室。笔者觉得名字改的非常合理&#xf…

NVMe扫盲

众所周知,固态硬盘拥有比机械硬盘更快的读写速度。现在大多数机器运用的是SATA总线标准,实际最高传输约为600MB/s。而支持PCIe总线,NVMe协议的SSD,实际传输速度将超过1000MB/s。到底 什么是NVMe 呢?下面小编为大家介绍关于NVMe的…

NVME_PCIE_SATA_AHCI_M.2_2.5“

SATA和PCIe两个都是总线标准。它们是并列发展的关系,并不是谁取代谁的关系。 SATA:由IDE/PATA标准发展而来,主要用途是把存贮设备(硬盘)连接到主机(主板)。 SATA经历了如下版本: SA…

硬盘检测 Victoria教程:每个扇区512byte(现在新的硬盘每个扇区有4K)一个块是4K(4096)扇区,1个块由连续的8个扇区组成。Victoria扫描常选块由2048扇区每扇区512字节

一、注意事项 1. 下载完成后不要在压缩包内运行软件直接使用,先解压; 2. 如果软件无法正常打开,请右键使用管理员模式运行。 3. 为确保检测结果准确 (避免卡深灰块),运行 Victoria 检测前请确保电脑满足以下要求: …

JavaScript基础知识回顾 数据类型,循环,条件表达式

JavaScript基础知识回顾 1.什么是JavaScript? JavaScript是一种专门为与网页交互而设计的脚本语言**,它由三个部分组成: 1.ECMAScript 提供核心语言功能。 2.文档对象模型(DOM)提供了访问和操作网页内容/元素的方法和接口。 …

魅蓝android 6,魅蓝6T评测:系统体验和点评

系统:愣是用出了千元机的快感 魅蓝6T搭载基于Android 7.0的Flyme 6系统,并会在未来提供Flyme 7升级支持。作为国内起步较早的几款定制系统之一,Flyme系统凭借流畅体验积累了不少粉丝。作为千元机的魅蓝6T也凭借Flyme出色的人机交互&#xff0…

魅蓝android 6,魅蓝6T评测:性能测试和总结

硬件:成熟神U还能再战 硬件向来不是百元机最出色的地方,魅蓝6T这次没有例外。搭载联发科MT6750处理器,提供3GB/4GB运行内存,性能无需多说是属于入门级别的配置。 但还是照例跑一下分,安兔兔总分50597分,Gee…

魅族魅蓝note6救砖及高通救砖工具分享

首先说下,这个救砖工具及包比较大快五G: https://pan.baidu.com/s/1fptIvpr1RfySNg3gbRnr8A 提取码:q2po 而且百度云限速,除非有百度云会员的直接电脑下也行,没耐心的还是去售后维修中心或者返厂吧。 有耐心的可以继续下面的步…