Nvme 协议第一章节学习
@Nvme Express Base Specification
第一章 简介
1.1概述
NVM ExpressTM(NVMeTM)接口允许主机软件与非易失性存储器子系统通信。
此接口针对企业和客户端固态驱动器进行了优化,通常作为寄存器级接口连接到PCI Express接口。
注:在开发过程中,本规范被称为企业NVMHCI。然而,在完成之前,该名称已修改为NVM Express基本规范。此接口的目标是在客户端和企业系统中使用。
1.1.1 NVMe over PCIE 和 NVMe over Fabrics
NVM Express基本规范修订版1.4和之前的修订版定义了一个寄存器级接口,用于主机软件通过PCI Express与非易失性存储器子系统通信(PCIeTM上的NVMeTM)。
NVMeTM over Fabrics规范定义了一个协议接口和NVMe接口的相关扩展,使其能够通过其他互连(例如以太网、InfiniBand™, 光纤通道)。结构上的NVMe规范对每个NVMe传输都有一个NVMe传输绑定(在该规范中或通过引用)。
在本规范中,可以将需求/功能记录为特定于结构上的NVMe实现或特定的NVMe传输绑定。
此外,PCIe上的NVMe和Fabrics上的NVMe实现系统对功能和特性的支持要求可能有所不同。
1.2范围
该规范定义了用于与NVM子系统中的控制器通信的寄存器接口。它还定义了控制器可能支持的标准命令集。有三种类型的控制器具有不同的功能:
a) I/O controllers;
b) discovery controllers; and
c) administrative controllers
在本文档中,当可根据上下文确定适用的控制器类型时,通常使用通用术语控制器,而不是枚举特定的控制器类型。
1.3 范围之外
寄存器接口和命令集是与NVM的任何使用模型分开指定的,而是仅指定到NVM子系统的通信接口。因此,本规范没有规定非易失性存储器系统是否用作固态驱动器、主存储器、高速缓冲存储器、备份存储器、冗余存储器等。具体的使用型号不在范围内,是可选的,并且未获得许可。该接口是在任何非易失性内存管理(如损耗均衡)之上指定的。对诸如NAND之类的NVM技术的擦除和其他管理任务进行了抽象。
本规范不包含任何关于缓存算法或技术的信息。
本说明书中提及的其他已发布规范的实现或使用,即使需要符合规范,也不在本规范的范围内(例如PCI、PCI Express和PCI-X)。
1.4 操作原理
NVM Express可扩展接口旨在满足使用基于PCI Express的固态驱动器或结构连接设备的企业和客户端系统的需求。该接口提供了优化的命令提交和完成路径。它支持并行操作,支持最多65535个I/O队列,每个I/O队列最多有64Ki-1个未完成的命令。
此外,还增加了对许多企业功能的支持,如端到端数据保护(与SCSI保护信息,通常称为T10 DIF和SNIA DIX标准)、增强的错误报告和虚拟化。
接口具有以下关键属性:
* 不需要在命令提交或完成路径中读取不可缓存/MIO寄存器;
* 在命令提交路径中,最多需要一个MMIO寄存器写入;
* 支持最大65535个IO队列,每个IO队列支持65535个未完成的command;
* 每个队列的优先级具有定义明确的仲裁机制;
* 完成4KiB读取请求的所有信息都包含在64B的命令本身中,确保了高效的小型IO操作;
* 高效精简的指令集;
* 支持MSI/MSI-X和中断聚合;
* 支持多namespaces;
* 支持SR-IOV等I/O虚拟化体系结构;
* 错误报告和管理能力
* 支持多通路IO和namespace共享。
该规范定义了一组精简的寄存器,包括以下功能:
* 显示controller的capabilities。
* 控制器故障状态(直接通过CQ处理命令状态)
* admin 队列设置,io 队列设置是通过admin cmd实现;
* Doorbell registers针对提交和完成队列的数量。
NVM Express控制器与单个PCI功能相关联。适用于整个控制器的功能和设置显示在控制器功能(CAP)寄存器和标识控制器数据结构中。
namespace是可以格式化为逻辑块的大量非易失性存储器。一个nvme express 控制器可以支持使用多namespace 通过引用namespace ID。namespace 可以被创建或者删除通过使用namespace management和namespace Attachment cmd.Identify namespace 数据结构显示了一个指定的namespace的功能和设置。所有namespace通用的功能和设置由namespace ID FFFFFFFF h的Identify namespace数据结构报告。
Nvm express 接口是基于成对的SQ和CQ的机制。command是通过host 放到一个SQ里面,Completions 是被controller放到一个与之对应的CQ里面。多个SQ可以使用相同的CQ。SQ和CQ是在内存中分配的。
admin SQ和对应CQ是用于controller管理和控制的。(例如:IO SQ和CQ的创建、删除,命令的中断等)。只有admin cmd可以被提交到admin SQ里面。
IO 命令集与IO 队列一起使用。协议定义了IO 命令集名为NVM Comand Set.Host 选择一个IO 命令集对IO 队列使用。Host 创建队列,数量达到控制器支持的最大数。通常创建的命令队列数量是基于系统配置和预期的workload。例如,在一个基于4核处理器的系统上,每个core有一个队列对一避免锁定并确保在合适的处理器core的缓存中创建数据结构。Figure 1 提供了一种队列对机制的图形解释,展示了在SQ与CQ之前1比1的映射。Figure 2展示了一个例子,多个IO SQ在core B上对应同一个CQ。Figure 1和Figure 2都展示了 admin SQ和admin CQ是1比1 对应的。
一个SQ 是一个具有固定大小的环形buffer,是Host用来提交 给controller 执行的命令。Host 更新对应的SQ Tail doorbell寄存器当有一个新的命令需要执行的时候。在controller内部之前的SQ Tail 值会被复写当新的doorbell 寄存器被写的时候。controller 会从SQ中按顺序的取到提交的命令条目并且可以按任意的顺序去执行这些command。每一个SQ条目就是一个command。一个command是64字节。内存中用于数据传输的物理内存位置是使用g Physical Region Page(PRP)和Scatter Gather Lists(SGL)。每个command都包含有2个PRP条目或者一个SGL段落。如果需要两个以上PRP 条目来描述数据缓存区,则提供一个指针指向用来描述PRP 条目的List。如果需要超过一个SGL段落来描述数据缓存区,SGL 段落提供一个指针指向下一个SGL段落。
一个CQ是一个具有固定大小的环形buffer,用来发布完成命令的状态。已完成的命令是由SQ标识符和Host分配的命令标识符组成的唯一标识符。多个SQ可能与一个CQ关联。这个特性可用于单个工作进程通过一个完成队列处理所有命令完成的情况,即使这些command来自不同的SQ。CQ的head 指针会被Host更新,在host处理完最后一个空闲的CQ的完成队列的条目。在完成队列条目中定义了相位标记(P)位,以指示条目是否是在未查阅注册表的情况下新发布的。这使Host能够确认新条目是上一轮还是当前一轮完成通知的一部分发布的。具体地说,在完成队列条目的每一轮中,控制器反转相位标记位。
1.4.1 多通路IO和namespace共享
本章节概述了多通路IO和namespace 共享。多路径I/O指的是单个主机和命名空间之间的两个或多个完全独立的路径,而命名空间共享指的是两个或更多主机使用不同的NVM Express控制器访问公共共享命名空间的能力。
1.4.2 非对称控制器的行为
1.5 约定
硬件应为标记为保留的所有位和寄存器返回“0”,主机软件应写入值为0h的所有保留位和寄存器。
在寄存器章节(即第2节和第3节)内,使用了以下术语和缩写:RO :只读RW :可读可写R/W :可读可写。读取的值可能不是最后写入的值。RWC :Read/Write ‘1’ to cleaRWS :Read/Write ‘1’ to setImpl Spec :控制器可以自由实现HwInit :默认状态取决于NVM Express控制器和系统配置。该值在重置时初始化,例如通过扩展ROM,或者在集成设备的情况下,通过平台BIOS。Reset :此列指示重置后字段的值。
针对一些寄存器字段,它是特定于具体实施的字段是RW、RWC还是RO。这通常显示为RW/RO或RWC/RO,表示如果不支持该功能,则该字段为只读。
当文档中引用寄存器字段时,使用的约定是“寄存器符号.字段符号”。例如,PCI命令寄存器奇偶校验错误响应启用位的名称为CMD.PEE。如果寄存器字段是一个位数组,则该字段被称为“寄存器符号。字段符号(数组偏移到元素)”
基于0的值是一种编号方案,其中数字0h表示1h的值,1h表示2h,2h表示3h等。在该编号方案中,没有表示0h值的方法。
除非另有规定,否则本规范中的值以1为基础(即,数字1h表示1h的值,2h表示2h等)。
值的大小以二进制单位或十进制单位显示。用于表示这些值的符号如图7所示
1.6 定义
1.6.1 admin queue
Admin queue是标识符为0的一对SQ和CQ队列。Admin SQ和相应的CQ是分别用来提交管理命令队列和接受这些管理命令的完成。
Admin SQ是与CQ是一一对应切唯一对应。
1.6.2 administrative controller
一种用于公开允许主机管理NVM子系统的功能的控制器。管理控制器不实现I/O队列,不提供对与非易失性存储器存储介质上的逻辑块相关联的数据或元数据的访问,也不支持连接到管理控制器的命名空间(即,从不存在任何活动NSID)。
1.6.3 arbitration burst
一次可以从使用具有紧急优先级类仲裁的RR或WRR的提交队列启动的最大命令数。
1.6.4 arbitration mechanism
用于确定在启动控制器执行的命令之前选择哪个提交队列的方法。定义了三种仲裁机制,包括循环机制、具有紧急优先级的加权循环机制和特定于供应商的机制
1.6.5 cache
1.6.6 candidate command
1.6.7 command completion
1.6.8 command submission
1.6.9 controller
1.6.10 directive
1.6.11 discovery controller
1.7 Key Word
1.7.1 mandatory
一个关键字,指示本规范定义的要实现的项。
1.7.2 may
1.7.3 optional
描述本规范不要求的功能的关键字。但是,如果实现了规范中定义的任何可选功能,则该功能应按照规范定义的方式实现。
1.7.4 R
1.7.5 reserved
一个关键字,指的是为将来的标准化而保留的位、字节、字、字段和操作码值。它们的使用和解释可以通过本规范或其他规范的未来扩展来指定。保留位、字节、字、字段或寄存器应清除至0h,或根据本规范的未来扩展。收件人不需要检查保留的位、字节、字或字段。命令中定义字段中的保留编码值的接收应作为错误报告。将保留的编码值写入控制器寄存器字段会产生未定义的结果。
1.7.6 shall
1.7.7 should
1.8 Byte, Word, and Dword 关系
相关文章:
Nvme 协议第一章节学习
Nvme Express Base Specification 第一章 简介 1.1概述 NVM ExpressTM(NVMeTM)接口允许主机软件与非易失性存储器子系统通信。 此接口针对企业和客户端固态驱动器进行了优化,通常作为寄存器级接口连接到PCI Express接口。 注:在…...

三维模型3DTile格式轻量化压缩处理工具常用几款软件介绍
三维模型3DTile格式轻量化压缩处理工具常用几款软件介绍 三维模型3DTile格式的轻量化处理旨在减少模型的存储空间和提高渲染性能。以下是一些推荐的工具软件,可以用于实现这个目的: MeshLab:MeshLab是一个开源的三维模型处理软件,…...
【工具篇】高级 TypeScript 案例
本文说明:TypeScript 相关文章,了解更多特性。 网页编辑器: https://www.typescriptlang.org/zh/play 文章目录 TypeScript联合类型交叉类型装饰器混入 mixin泛型Promise 简单应用 TypeScript 联合类型 概念:当某个函数只有一个参…...

利用Python将dataframe格式的所有列的数据类型转换为分类数据类型
一、样例理解 import pandas as pd import numpy as np# 创建测试数据 feature_names [col1 , col2, col3, col4, col5, col6] values np.random.randint(20, size(10,6))dataset pd.DataFrame(data values, columns feature_names)print("转换前的数据为\n",d…...

安全线程的集合
1. CopyOnWriteArrayList package com.kuang.unsafe;import java.util.*; import java.util.concurrent.CopyOnWriteArrayList;//java.util.ConcurrentModificationException 并发修改异常! 因为List集合线程不安全! public class ListTest {public st…...
用GoConvey编写单元测试的一些总结
一、尽量用Convey将所有测试用例的Convey汇总 用Convey嵌套的方法,将所有测试用例的Convey用一个大的Convey包裹起来,每个测试函数下只有一个大的Convey。比如下面的示例代码: import ("testing". "github.com/smartystreet…...
Linux Arm64修改页表项属性
文章目录 前言一、获取pte1.1 pgd_offset1.2 pud_offset1.3 pmd_offset1.4 pte_offset_kernel 二、修改pte属性2.1 set/clear_pte_bit2.2 pte_wrprotect2.3 pte_mkwrite2.4 pte_mkclean2.5 pte_mkdirty 三、set_pte_at四、__flush_tlb_kernel_pgtable五、demo参考资料 前言 在…...

elasticsearch14-高亮
个人名片: 博主:酒徒ᝰ. 个人简介:沉醉在酒中,借着一股酒劲,去拼搏一个未来。 本篇励志:三人行,必有我师焉。 本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》,SpringCloud…...

HUAWEI华为MateBook X Pro 2021款 i7 集显(MACHD-WFE9Q)原装出厂Win10系统20H2
华为笔记本电脑原厂系统自带指纹驱动、显卡驱动、声卡驱动、网卡驱动等所有驱动、出厂主题壁纸、系统属性华为专属LOGO标志、Office办公软件、华为电脑管家等预装程序 链接:https://pan.baidu.com/s/1oeSM0ciwyyRIKms5tR4SNA?pwdo2gq 提取码:o2gq...

21天学会C++:Day9----初识类与对象
CSDN的uu们,大家好。这里是C入门的第九讲。 座右铭:前路坎坷,披荆斩棘,扶摇直上。 博客主页: 姬如祎 收录专栏:C专题 目录 1. 面向过程与面向对象 2. 类的定义 3. 类中的访问限定符 3.1 访问限定符的…...

【深度学习】 Python 和 NumPy 系列教程(十七):Matplotlib详解:2、3d绘图类型(3)3D条形图(3D Bar Plot)
目录 一、前言 二、实验环境 三、Matplotlib详解 1、2d绘图类型 2、3d绘图类型 0. 设置中文字体 1. 线框图 2. 3D散点图 3. 3D条形图(3D Bar Plot) 一、前言 Python是一种高级编程语言,由Guido van Rossum于1991年创建。它以简洁、易读…...
基于Spring Boot+vue的酒店管理系统
文章目录 项目介绍主要功能截图:前台后台部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于Spring Boot+vue的酒店管理…...
Python 通过threading模块实现多线程
视频版教程 Python3零基础7天入门实战视频教程 我们可以使用threading模块的Thread类的构造器来创建线程 def _ init _(self, groupNone, targetNone, nameNone, args(), kwargsNone, *, daemonNone): 上面的构造器涉及如下几个参数。 group:指定该线程所属的线程组。目前该…...

用一个RecyclerView实现二级评论
先上个效果图(没有UI,将就看吧),写代码的整个过程花了4个小时左右,相比当初自己开发需求已经快了很多了哈。 给产品估个两天时间,摸一天半的鱼不过分吧(手动斜眼) 需求拆分 这种大家…...
音视频 SDL简介
一、SDL简介 SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Win…...

7.前端·新建子模块与开发(自动生成)
文章目录 学习地址视频笔记自动代码生成模式开发增删改查功能调试功能权限分配 脚本实现权限分配 学习地址 https://www.bilibili.com/video/BV13g411Y7GS/?p15&spm_id_frompageDriver&vd_sourceed09a620bf87401694f763818a31c91e 视频笔记 自动代码生成模式开发 …...

Linux 创建目录
语法:mkdir xxx Linux路径 在当前目录下创建文件夹 在/目录下创建文件夹 如果想要一次性创建多个层级的目录,如下图 会报错,因为上级目录test并不存在,所以无法创建test目录 可以通过-p选项,将一整个链条都创建完成…...
【DIY小记】修复Win10启动出现蓝屏0xc0000185错误的一些方法
近些日子想到自己尘封已久的笔记本电脑没有开机了,很多软件驱动之类的没有更新,就打算把电脑开起来做一轮批量升级。但开电脑的时候很久没有进入Win10桌面,等了很长一段时间蓝屏提示0xc0000185错误,说系统需要恢复。经历了一番折腾…...

Linux 下的 10 个 PDF 软件
本文[1]是我们正在进行的有关 Linux 顶级工具系列的延续,在本系列中,我们将向您介绍最著名的 Linux 系统开源工具。 随着互联网上越来越多地使用可移植文档格式 (PDF) 文件来获取在线书籍和其他相关文档,拥有 PDF 查看器/阅读器对于桌面 Linu…...
浅谈redis分布式锁
浅谈redis分布式锁 分布式锁介绍 分布式锁,顾名思义,分布式系统中的锁,当多个进程不在同一个系统中时,用分布式锁控制各个进程对共享资源的访问,通过互斥来保持一致性。 使用场景:电商中某商品的秒杀活动…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...
如何通过git命令查看项目连接的仓库地址?
要通过 Git 命令查看项目连接的仓库地址,您可以使用以下几种方法: 1. 查看所有远程仓库地址 使用 git remote -v 命令,它会显示项目中配置的所有远程仓库及其对应的 URL: git remote -v输出示例: origin https://…...