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分布式锁 分布式锁介绍 分布式锁,顾名思义,分布式系统中的锁,当多个进程不在同一个系统中时,用分布式锁控制各个进程对共享资源的访问,通过互斥来保持一致性。 使用场景:电商中某商品的秒杀活动…...
【Python保姆级教程】List容器
文章目录 前言一、列表是什么二、列表的定义2.1 有初始值2.2 空列表使用方括号创建空列表使用list()函数创建空列表 三、list列表常用操作3.1 添加元素3.2 删除元素3.3 修改元素3.4 列表长度 四、遍历操作4.1 使用for循环4.2 使用while循环和索引 总结 前言 Python是一种广泛使…...
微服务保护-授权规则
个人名片: 博主:酒徒ᝰ. 个人简介:沉醉在酒中,借着一股酒劲,去拼搏一个未来。 本篇励志:三人行,必有我师焉。 本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》,SpringCloud…...
v-if失效原因
一般v-if失效都是和绑定变量有关,我所知道的一般有两种 1.绑定的变量为String类型或者其他类型 就是返回的变量类型与所需要的布尔类型不匹配。 <template><div><div id"container" ref"container" v-iftype></div>&l…...
Chrome 基于 Wappalyzer 查看网站所用的前端技术栈
1. 找到谷歌商店 https://chrome.google.com/webstore/search/wappalyzer?utm_sourceext_app_menu 2. 搜索 Wappalyzer 3. 添加至Chrome 4. 使用 插件 比如打开 https://www.bilibili.com/ 就可以看到其所以用的前端技术栈了...
python的装饰器
作用:在不改变原来函数的代码情况下,进行修改,或者增加函数的功能装饰器本质上就是一个闭包雏形:def wrapper(fn): wrapper: 装饰器 , fn: 目标函数def inner():# 在目标函数执行前的一些动作fn()# 在目标函数执行后的一些动作return inner #千万别加(),这里是返回一…...
P2P协议的传输艺术
TP 采用两个 TCP 连接来传输一个文件。 控制连接:服务器以被动的方式,打开众所周知用于 FTP 的端口 21,客户端则主动发起连接。该连接将命令从客户端传给服务器,并传回服务器的应答。常用的命令有:list——获取文件目…...
辅助驾驶功能开发-功能规范篇(21)-4-XP行泊一体方案功能规范
XPilot Parking 自动泊车系统 • 超级自动泊车辅助(Super AutoParking Assist)、语音控制泊车辅助(Autoparking with Speech) - 产品定义 超级自动泊车辅助是⼀个增强的自动泊车辅助系统。在超级自动泊车辅助系统中,识别车位将会变得实时可见, 并且不可泊入的⻋位也将…...
家政服务小程序上门服务小程序预约上门服务维修保洁上门服务在线派单技师入口
套餐一:源码=1500元 套餐二:全包服务 包服务器+域名+认证小程序+搭建+售后=2000元 主要功能: 1、服务商入驻 支持个人或企业入驻成为平台服务商; 2、发布商品 入驻服务商后,可以发布服务商品,用户可以在线下单,预约服务; 3、发布需求 用户可以发布一口价或竞价需求…...
LeetCode精选100题-【3数之和】-2
这里写自定义目录标题 解法1:解法2: 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。注意:答案中不…...
springboot集成mybatis-plus
一、在spring boot中配置mybatis-plus 1、创建一个spring boot项目,注意勾选mysql 2、在pom.xml文件中添加mybatis-plus的依赖包 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0&qu…...
物联网技术是学什么的/seo薪资水平
FlatBuffers是一个高性能、跨平台的序列化库,支持C、C#、C、Go、Java、JavaScript、TypeScript、PHP和Python。由google开发,并用于游戏及其他对性能要求高的应用。 1、不用解析/解包,就可以直接访问序列化的数据 1)写schema文件。…...
酒店网站html模板/网络销售靠谱吗
1.创建文件myrule 2.编写myrule内容 package com.myrule;Configuration public class MySelfRule {Beanpublic IRule myRule(){return new RandomRule(); //随机的方法} }3.在主启动类中加入这个注解 CLOUD-PAYMENT-SERVICE为服务名称 configuration为刚才我们写的类 Ribbon…...
做公司网站成本/b2b推广网站
风险管理 风险管理是指如何在项目或者企业一个肯定有风险的环境里把风险可能造成的不良影响减至最低的管理过程。 风险管理当中包括了对风险的量度、评估和应变策略。理想的风险管理,是一连串排好优先次序的过程,使当中的可以引致最大损失及最可能发生的…...
查看网站建设时间/广州营销型网站
自由软件永远是自由的! 近两天,很多媒体都转发了一篇文章,是讲 ASF(Apache Software Foundation) 和 GitHub 受美国法律限制的事情,部分业内人士也在担心,是否有可能中国的程序员们会受到限制的影响而不能使用 Apache …...
东莞专业网站推广需要多少钱/宠物美容师宠物美容培训学校
文章目录 diff的基本语法及参数 比较两个文件并排格式输出-u 以合并文件的方式显示不同 补充: 三个文本比较命令: comm: 比较相同的文本,特点是: 如果文本中有空格就无法识别 patch 补丁: 举例: 后记 dif…...
thinkphp只能做网站/seo引擎优化
如何通过Infopath2010编程方程向Sharepoint List提交数据 针对上一篇修改了一下,可以直接提交重复表里的数据到列表中,代码实现如下: public void CTRL1_5_Clicked(object sender, ClickedEventArgs e) { // 在此处编写…...