Nvme Spec 第一章节学习
@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 Spec 第一章节学习
Nvme Express Base Specification 第一章 简介 1.1概述 NVM ExpressTM(NVMeTM)接口允许主机软件与非易失性存储器子系统通信。 此接口针对企业和客户端固态驱动器进行了优化,通常作为寄存器级接口连接到PCI Express接口。 注:在…...
第一章:最新版零基础学习 PYTHON 教程(第九节 - Python 语句中的 – 多行语句)
Python 中的语句: 在Python中,语句是Python解释器可以读取和执行的逻辑命令。它可能是Python 中的赋值语句或表达式。 Python 中的多行语句: 在Python中,语句通常写成一行,每行的最后一个字符是换行符。要将语句扩展到一行或多行,我们可以使用大括号 {}、圆括号 ()、方…...
kafka 3.0 离线安装
1.安装zookeeper 解压apache-zookeeper-3.8.0-bin.tar.gz到指定目录,复制conf目录下zoo_sample.cfg到zoo.cfg,并修改配置。 # The number of milliseconds of each tick tickTime=2000 # The number of ticks that the initial # synchronization phase can take initLimit…...

MySQL数据库入门到精通2--基础篇(函数,约束,多表查询,事务)
3. 函数 函数 是指一段可以直接被另一段程序调用的程序或代码。MySQL中的函数主要分为以下四类: 字符串函数、数值函数、日期函数、流程函数。 3.1 字符串函数 MySQL中内置了很多字符串函数,常用的几个如下: 演示如下: A. con…...

c-数据在内存中的存储-day7
...

3D大模型如何轻量化?试试HOOPS Communicator,轻松读取10G超大模型!
随着计算机技术的不断发展,3D模型在各行各业中的应用越来越广泛。然而,随着模型的复杂性和规模不断增加,处理和浏览超大型3D模型变得越来越具有挑战性。本文将探讨如何轻量化3D大模型,以及如何使用HOOPS Communicator来读取和浏览…...
go并发操作且限制数量
使用管道chan func returnNum() int64 {return time.Now().Unix() } func main() {threadAmount : runtime.GOMAXPROCS(0)if threadAmount < 2 {threadAmount 2}fmt.Println(threadAmount)threadChan : make(chan int, threadAmount)defer close(threadChan)for {for i :…...
AI深度学习-卷积神经网络000
文章目录 前言1.什么是深度学习2.语义分割与实例分割概述3.什么是卷积?4.Unet网络 前言 本栏目,主要为深度学习保姆教程。 主要通过B站视频整理而来: 深度学习保姆级教学 Unet语义分割视觉三维重建算法 1.什么是深度学习 深度学习保姆级教…...

网站有反爬机制就爬不了数据?那是你不会【反】反爬
目录 前言 一、什么是代理IP 二、使用代理IP反反爬 1.获取代理IP 2.设置代理IP 3.验证代理IP 4.设置代理池 5.定时更新代理IP 三、反反爬案例 1.分析目标网站 2.爬取目标网站 四、总结 前言 爬虫技术的不断发展,使得许多网站都采取了反爬机制ÿ…...

2023华为杯研究生数学建模C题分析
完整的分析查看文末名片获取! 问题一 在每个评审阶段,作品通常都是随机分发的,每份作品需要多位评委独立评审。为了增加不同评审专家所给成绩之间的可比性,不同专家评审的作品集合之间应有一些交集。但有的交集大了,则…...

第三天:实现网络编程基于tcp/udp协议在Ubuntu与gec6818开发板之间双向通信
互联网地址 每一台设备接入互联网后,都会举报一个唯一的地址编号 IP地址 INTERNET地址 internet地址 :它是协议上的一个逻辑地址 目前来说,我们主要的IP地址有两类 IPV4 IPV6 IPV4 其实就是使用一个32bit整数作为IP IPV6 其实就是使用一…...
【MediaSoup---源码篇】(三)Transport
概述 RTC::Transport是mediasoup中的一个重要概念,它用于在mediasoup与客户端之间传输实时音视频数据。 Transport继承着众多的类,主要用于Transport的整体感知 class Transport : public RTC::Producer::Listener,public RTC::Consumer::Listener,publ…...

爱分析《商业智能最佳实践案例》
近日,国内知名数字化市场研究咨询机构爱分析发布《2023爱分析商业智能最佳实践案例》,此评选活动面向落地商业智能的各行企业和商业智能厂商,以第三方专业视角深入调研,评选出具有参考价值的创新案例。永达汽车集团与数聚股份合作…...
golang:context
context作用 goroutine的退出机制 多个goroutine都是平行的被调度的,多个goroutine如何协调工作涉及通信、同步、通知和退出 通信:goroutine之间的通信同步chan通道 同步:不带缓冲的chan提供了一个天然的同步等待机制。通过WaitGroup也可以…...
探讨代理IP与Socks5代理在跨界电商中的网络安全应用
在数字化时代,跨界电商已经成为了商业世界中的一大趋势。然而,跨越国界的电商活动也伴随着网络安全挑战。本文将讨论如何利用代理IP和Socks5代理技术来提高跨界电商中的网络安全,同时也探讨了与游戏相关的爬虫应用。 1. 代理IP和Socks5代理的…...

Guava Cache介绍-面试用
一、Guava Cache简介 1、简介 Guava Cache是本地缓存,数据读写都在一个进程内,相对于分布式缓存redis,不需要网络传输的过程,访问速度很快,同时也受到 JVM 内存的制约,无法在数据量较多的场景下使用。 基…...

ARM 汇编指令作业(求公约数、for循环实现1-100之间和、从SVC模式切换到user模式简单写法)
1、求两个数最大公约数 .text .globl _start_start:mov r0, #9mov r1, #15 Loop: 循环cmp r0,r1 比较r0和r1的大小beq stop 当r0和r1相等时,跳到stop标签subhi r0,r0,r1 r0-r1>0 时,证明r0>r1,将r0-r1的值赋给r0&…...
Go - 【字符串,数组,哈希表】常用操作
一. 字符串 字符串长度: s : "hello" l : len(s) fmt.Println(l) // 输出 5遍历字符串: s : "hello" for i, c : range s {fmt.Printf("%d:%c ", i, c) } // 输出:0:h 1:e 2:l 3:l 4:ofor i : 0; i < le…...

vue 普通组件的 局部注册
vue 普通组件的 注册 11 Vue2_3入门到实战-配套资料\01-随堂代码素材\day03\素材\00-准备代码\小兔鲜首页静态页\src...

医疗虚拟仿真和虚拟现实有什么区别?哪个更好?
随着我们在仿真教育中越来越多地使用新技术,区分虚拟模式的类型很重要。虚拟仿真是一个统称,用来概括术语来描述各种基于仿真的体验,从基于屏幕的平台到沉浸式虚拟现实。然而,各虚拟平台在保真度、沉浸感和临场感的水平上有很大差…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...