NVMe系统内存结构 - 命令格式

NVMe系统内存结构 - 命令格式

  • 1 Submission Queue与Completion Queue定义
    • 1.1 空队列
    • 1.2 满队列
    • 1.3 队列大小
    • 1.4 队列标识符
    • 1.5 队列优先级
  • 2 Submission Queue - 命令格式
    • 2.1 Command Dword 0
    • 2.2 Command Format – Admin Command Set
    • 2.3 Command Format – NVM Command Set
    • 2.4 Command Format – Admin and NVM Vendor Specific Commands (可选)
  • 3 小结

本文属于《 NVMe协议基础系列教程》之一,欢迎查看其它文章。
本节介绍NVM Express使用的系统内存结构。

1 Submission Queue与Completion Queue定义

Head和Tail条目指针,对应于Completion Queue Head Doorbells和Submission Queue Tail Doorbells。doorbell寄存器由host软件更新。

  • Tail
    一个Queue条目的提交者,使用当前Tail条目指针,来标识下一个空闲Queue条目空间。
    提交者将新条目,提交到Tail指向的空闲Queue条目空间后,对Tail条目指针加1。
    如果Tail条目指针增量,超过Queue大小,则Tail条目指针将归零。
    只要Queue未满,提交者可以继续向Queue提交条目。
    注意: 提交者应考虑Queue封装条件。

  • Head
    Queue上条目的消费者,使用当前的Head条目指针,来标识下一个要从Queue中取出的条目。
    在从Queue中取出下一个条目后,消费者对Head条目指针加1。
    如果Head条目指针增量,超过Queue大小,则Head条目指针将归零。
    只要Queue不为空,消费者就可以继续从Queue中取出条目。
    注意: 消费者应考虑Queue封装条件。

Submission Queue和关联的Completion Queue的创建和删除,需要由主机软件正确排序。

  • 先创建Completion Queue,后创建Submission Queue
    主机软件应在,创建任何关联的Submission Queue之前,创建Completion Queue。Submission Queue可以在,关联的Completion Queue创建后的任何时间创建。
  • 先删除Submission Queue,后删除Completion Queue
    主机软件应在,删除Completion Queue之前,删除所有相关联的Submission Queue。主机软件应该,只在Submission Queue处于空闲状态,且没有未完成的命令时才删除它。

如果主机软件,将无效值写入Submission Queue Tail Doorbell或Completion Queue Head Doorbell寄存器,并且Asynchronous Event Request命令未完成,则异步事件将以状态码"Invalid Doorbell Write Value"投递到Admin Completion Queue;关联的Queue应该被主机软件删除并重新创建。对于遇到此错误的Submission Queue,控制器可能会完成先前获取的命令;但不会再获取额外的命令。这种情况可能是,由于主机软件试图将条目添加到满的Submission Queue,或从空的Completion Queue中删除条目引起的。

命令被覆盖时的行为是未定义的。

如果Completion Queue中,没有空闲的Completion Queue条目,则控制器不应将状态,投递到该Completion Queue,直到Completion Queue条目变得空闲为止。在这种情况下,控制器可以停止处理,与受影响的Completion Queue关联的其他Submission Queue条目,直到Completion Queue条目空闲可用为止,但控制器可以继续处理其他队列。

1.1 空队列

当Head条目指针等于Tail条目指针时(Head == Tail),队列为空。
在这里插入图片描述

1.2 满队列

当Head条目指针比Tail条目指针多1时(Head == Tail + 1),队列已满。满时队列中的条目数比队列Size少一个。
注意:在确定队列是否已满时,应考虑队列封装条件。
在这里插入图片描述

1.3 队列大小

Queue大小在一个16位的基于0的字段中表示,该字段表示队列中的条目数。

  • I/O Queue大小:2 ~ 64K
    包括l/O Submission Queue或I/O Completion Queue。Queue具体大小,受CAP.MQES字段中报告的,控制器支持的最大队列大小的限制。
  • Admin Queue大小:2 ~ 4K
    包括Admin Submission Queue或Admin Completion Queue。Queue具体大小,受AQA.ACQS和AQA.ASQS字段的限制。

由于Head和Tail条目指针定义,每个队列中的一个条目不可使用。

1.4 队列标识符

每个队列通过创建队列时,分配给队列的16位ID值来标识。

1.5 队列优先级

如果支持带有Urgent优先级仲裁机制的加权轮询,则host软件可以分配一个Urgent、High、Medium或Low的队列优先级服务分类。如果不支持带有紧急优先级仲裁机制的加权轮询,则不使用该优先级设置,并被控制器忽略。

2 Submission Queue - 命令格式

每条命令的大小为64字节

  • 命令Dword 0、Namespace Identifier、Metadata Pointer、PRP Entry 1和PRP Entry 2,对所有Admin命令和NVM命令有共同的定义。
  • SGL Entry 1和Metadata SGL Segment Pointer,对所有NVM命令有共同的定义(SGLs不用于Admin命令)。
  • Metadata Pointer、PRP Entry 1、PRP Entry 2和Metadata SGL Segment Pointer,不是所有命令都使用的。

2.1 Command Dword 0

命令Dword 0定义,如下表所示。

Command Dword 0
BitDescription
31:16Command Identifier (CID):当与Submission Queue identifier结合使用时,此字段指定命令的唯一标识符。
15PRP or SGL for Data Transfer (PSDT):此字段指定与命令相关的任何数据传输,是否使用PRPs或SGLs。
如果清除为’ 0 ‘,则该命令将使用PRPs,来传输任何相关的数据或元数据。
如果设置为’ 1 ',则该命令使用SGLs,来传输任何相关的数据或元数据。
所有Admin命令,应使用PRPs。
14:10保留
09:08Fused Operation (FUSE):在融合操作中,通过将两个简单命令“融合”在一起,来创建复杂命令。
此字段指定,此命令是否是融合操作的一部分,如果是,它是序列中的哪个命令。在这里插入图片描述
07:00Opcode (OPC):指定要执行的命令的操作码。

2.2 Command Format – Admin Command Set

Admin命令集(Admin Command Set)和NVM命令集(NVM Command Set)的64字节命令格式,定义如下表所示。
将来定义的任何其他I/O命令集(I/O Command Set),都可以使用另一种命令大小或格式。

Command Format – Admin Command Set
BytesDescription
63:60Command Dword 15 (CDW15):该字段是命令专用的Dword 15。
59:56Command Dword 14 (CDW14):该字段是命令专用的Dword 14。
55:52Command Dword 13 (CDW13):该字段是命令专用的Dword 13。
51:48Command Dword 12 (CDW12):该字段是命令专用的Dword 12。
47:44Command Dword 11 (CDW11):该字段是命令专用的Dword 11。
43:40Command Dword 10 (CDW10):该字段是命令专用的Dword 10。
39:32PRP Entry 2 (PRP2):该字段包含该命令的第二个PRP条目,或者如果数据传输跨越两个以上的内存页,则该字段是一个PRP列表指针。
31:24PRP Entry 1 (PRP1):该字段包含该命令的第一个PRP条目,或者一个PRP列表指针,具体取决于该命令。
23:16Metadata Pointer (MPTR):该字段包含元数据的连续物理缓冲区的地址。该字段仅用于元数据与逻辑块数据不交错的情况,如Format NVM命令中指定的。此字段应以Dword对齐。
15:08保留
07:04Namespace Identifier (NSID):这个字段指定了,这个命令应用到的命名空间ID。如果命令中没有使用命名空间ID,则该字段清空为0h。如果一个命令应用到设备上的所有命名空间,那么该字段应该设置为FFFFFFFFh。
除非另有说明,在使用命名空间ID的命令中,指定未激活的命名空间ID,将导致控制器在command中带有状态“Invalid Field”而中止命令。
在使用命名空间ID的命令中,指定无效的命名空间ID,将导致控制器以状态“Invalid Namespace”或“Format”中止命令。
03:00Command Dword 0 (CDW0):该字段对所有命令都是通用的,见上表Command Dword 0定义。

2.3 Command Format – NVM Command Set

Command Format – NVM Command Set
BytesDescription
63:60Command Dword 15 (CDW15):该字段是命令专用的Dword 15。
59:56Command Dword 14 (CDW14):该字段是命令专用的Dword 14。
55:52Command Dword 13 (CDW13):该字段是命令专用的Dword 13。
51:48Command Dword 12 (CDW12):该字段是命令专用的Dword 12。
47:44Command Dword 11 (CDW11):该字段是命令专用的Dword 11。
43:40Command Dword 10 (CDW10):该字段是命令专用的Dword 10。
39:24若将CDW0[15]清除为’0’,则该字段的定义为:
在这里插入图片描述
- PRP Entry 2 (PRP2):该字段包含该命令的第二个PRP条目,或者如果数据传输跨越两个以上的内存页,则该字段是一个PRP列表指针。
- PRP Entry 1 (PRP1):该字段包含该命令的第一个PRP条目,或者一个PRP列表指针,具体取决于该命令。

若将CDW0[15]设置为’1’,则该字段的定义为:
在这里插入图片描述
- SGL Entry 1 (SGL1):该字段包含该命令的第一个SGL段。如果SGL段是一个Data Block描述符,那么它描述了整个数据传输。如果需要多个SGL段来描述数据传输,那么第一个SGL段是一个Segment,或最后一个段描述符。
23:16若将CDW0[15]清除为’0’,则该字段的定义为:
在这里插入图片描述
- Metadata Pointer (MPTR):该字段包含元数据的连续物理缓冲区的地址。该字段仅用于元数据与逻辑块数据不交错的情况,如Format NVM命令中指定的。此字段应以Dword对齐。

若将CDW0[15]设置为’1’,则该字段的定义为:
在这里插入图片描述
- Metadata SGL Segment Pointer (MSGLP):该字段包含一个SGL段的地址,其中包含一个描述要传输的元数据的SGL描述符。该字段仅用于元数据与逻辑块数据不交错的情况,如Format NVM命令中指定的。该字段应Qword对齐。
15:08保留
07:04Namespace Identifier (NSID):这个字段指定了,这个命令应用的命名空间。如果该命名空间未用于该命令,则该字段将被清除为0h。如果命令应用于设备上的所有命名空间,则该值应设置为FFFFFFFFh。
03:00Command Dword 0 (CDW0):该字段对所有命令都是通用的,见上表Command Dword 0定义。

2.4 Command Format – Admin and NVM Vendor Specific Commands (可选)

除了为所有Admin和NVM命令,定义的通用字段外,Admin和NVM Vendor Specific命令可能支持Data Transfer字段中的Dwords数,和MPTR字段中的Dwords数。
如果支持,则Admin Vendor Specific Command和NVM Vendor Specific Command的命令格式,定义在下表中。

Command Format – Admin and NVM Vendor Specific Commands (可选)
BytesDescription
63:60Command Dword 15 (CDW15):该字段是命令专用的Dword 15。
59:56Command Dword 14 (CDW14):该字段是命令专用的Dword 14。
55:52Command Dword 13 (CDW13):该字段是命令专用的Dword 13。
51:48Command Dword 12 (CDW12):该字段是命令专用的Dword 12。
47:44Number of Dwords in MPTR (NDM):该字段表示,元数据传输中的Dwords数量。
43:40Number of Dwords in Data Transfer (NDT):这个字段表示,数据传输中的Dwords数量。
39:16不同类型命令,此部分含义有所不同,具体参考Admin命令与NVM命令具体定义。
15:08保留
07:04Namespace Identifier (NSID):该字段表示,该命令应用的命名空间ID。如果命令中,没有使用命名空间ID,则该字段清空为0h。如果一个命令,应用到设备上的所有命名空间,那么该字段,应该设置为FFFFFFFFh。
对于Vendor Specific Command,控制器对未激活的命名空间ID的响应行为是厂商指定的。在使用命名空间ID的命令中,指定无效的命名空间ID,将导致控制器以状态“Invalid Namespace”或“Format”中止命令。
03:00Command Dword 0 (CDW0):该字段对所有命令都是通用的。

3 小结

命令需要被提交到Submission Queue中,以便NVMe控制器执行,在执行结束后,会有对应的完成状态,放入到Completion Queue中。

NVMe命令长度均为64Byte,对应的completion消息长度均为16Byte。
因此,在Submission Queue中,每条命令都是64字节,无论是Admin命令,还是NVM命令(IO命令)。

NVMe命令,按如下方式,进行组织:
在这里插入图片描述

  • 如果是Admin或NVM命令(IO命令),则在Metadata Pointer与Data Pointer这两个部分(39:16),含义有所不同,其他均相同。

  • 如果是Vendor Specific Command,除了在Metadata Pointer与Data Pointer这两个部分(39:16)不同外,还有Dword 10和Dword11这两个部分(47:40),含义有所不同,其他均相同。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

#define宏定义的初探

前言&#xff1a; 最基本的#define定义方式 #define可以定义宏&#xff0c;这点相信大家并不陌生&#xff0c;其定义的方式十分简单&#xff0c;给大家随便来一个最简单、最基础的定义方式看看&#xff1a; #include<stdio.h> #define a 3 int main() { printf(&quo…

软件测试|SQL中的UNION和UNION ALL详解

简介 在SQL&#xff08;结构化查询语言&#xff09;中&#xff0c;UNION和UNION ALL是用于合并查询结果集的两个关键字。它们在数据库查询中非常常用&#xff0c;但它们之间有一些重要的区别。在本文中&#xff0c;我们将深入探讨UNION和UNION ALL的含义、用法以及它们之间的区…

Redisson 源码解析 - 分布式锁实现过程

一、Redisson 分布式锁源码解析 Redisson是架设在Redis基础上的一个Java驻内存数据网格。在基于NIO的Netty框架上&#xff0c;充分的利用了Redis键值数据库提供的一系列优势&#xff0c;在Java实用工具包中常用接口的基础上&#xff0c;为使用者提供了一系列具有分布式特性的常…

Java LeetCode篇-二叉搜索树经典解法(实现:二叉搜索树的最近公共祖先、根据前序遍历建树等)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 判断合法 1.1 使用遍历方式实现验证二叉搜索树 1.2 使用递归方式实现验证二叉搜索树 2.0 求范围和 2.1 使用非递归实现二叉搜索树的范围和 2.2 使用递归方式实现…

软件测试|测试平台开发-Flask 入门:URL组成部分详解

简介 Flask 是一款流行的 Python Web 框架&#xff0c;它简单轻量而灵活&#xff0c;适用于构建各种规模的 Web 应用程序。在 Flask 中&#xff0c;URL&#xff08;Uniform Resource Locator&#xff09;是指定 Web 应用程序中资源的唯一标识符。URL 组成部分是构成一个完整 U…

可在图像中生成任意精准文本,支持中文!阿里开源AnyText

随着Midjourney、Stable Difusion等产品的出现&#xff0c;文生图像领域获得了巨大突破。但是想在图像中生成/嵌入精准的文本却比较困难。 经常会出现模糊、莫名其妙或错误的文本&#xff0c;尤其是对中文支持非常差&#xff0c;例如&#xff0c;生成一张印有“2024龙年吉祥”…

在甲骨文云上用 Ray +Vllm 部署 Mixtral 8*7B 模型

在甲骨文云上用 Ray Vllm 部署 Mixtral 8*7B 模型 0. 背景1. 甲骨文云 GPU 实例2. 配置 VCN 的 Security List3. 安装 Ray 和 Vllm4. 启动 Ray5. 启动 Vllm 0. 背景 根据好几个项目的需求&#xff0c;多次尝试 Mixtral-8x7B-Instruct-v0.1 这个模型&#xff0c;确实性能不错。…

GD32移植FreeRTOS

准备工作 GD32开发板。案例是以梁山派为开发板。Windows系统的电脑。当前是以Win11的电脑来实现案例的。Keil开发工具。并且已经安装好GD32依赖环境。FreeRTOS源码包。下载地址为: Releases FreeRTOS/FreeRTOS GitHub 当前以FreeRTOSv202212.01版本为例。也是目前的最新版本…

SpringMVC-HelloWorld

一、SpringMVC简介 1.1 SpringMVC和三层架构 MVC是一种软件架构思想&#xff0c;将软件按照模型、视图和控制器三个部分划分。 M&#xff1a;model&#xff0c;模型层&#xff0c;指工程中的JavaBean&#xff0c;用于处理数据。JavaBean分为两类&#xff1a; 实体类Bean&…

网络通信(11)-C#TCP服务端封装帮助类实例

本文使用Socket在C#语言环境下完成TCP服务端封装帮助类的实例。 实例完成的功能: 服务器能够连接多个客户端显示在列表中,实现实时刷新。 服务器接收客户端的字符串数据。 选中列表中的客户端发送字符串数据。 在VS中创建C# Winform项目,编辑界面,如下: UI文件 name…

4030 【例题2】Cashier Employment 出纳员问题(Poj1275Hdu1529)————一本通(提高篇)

今天主要来讲讲差分约束 题目大意&#xff1a; 从0点到23点&#xff0c;给出每个时刻需要的售货员个数&#xff0c;再给出每个时刻应征的售货员个数&#xff0c;然后让你求出满足需求的最小售货员个数 解题思路&#xff1a;差分约束 #include <queue> #include <cs…

Spring 动态数据源事务处理

在一般的 Spring 应用中,如果底层数据库访问采用的是 MyBatis,那么在大多数情况下,只使用一个单独的数据源,Spring 的事务管理在大多数情况下都是有效的。然而,在一些复杂的业务场景下,如需要在某一时刻访问不同的数据库,由于 Spring 对于事务管理实现的方式,可能不能达…

已解决 ValueError: Data cardinality is ambiguous 问题

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通Golang》…

WPF 导航界面悬浮两行之间的卡片 漂亮的卡片导航界面 WPF漂亮渐变颜色 WPF漂亮导航头界面 UniformGrid漂亮展现

在现代应用程序设计中&#xff0c;一个漂亮的WPF导航界面不仅为用户提供视觉上的享受&#xff0c;更对提升用户体验、增强功能可发现性和应用整体效率起到至关重要的作用。以下是对WPF漂亮导航界面重要性的详尽介绍&#xff1a; 首先&#xff0c;引人入胜的首页界面是用户与软…

Redis原理篇(Dict的收缩扩容机制和渐进式rehash)

Dict&#xff08;即字典&#xff09; Redis是一种键值型数据库&#xff0c;其中键与值的映射关系就是Dict实现的。 Dict通过三部分组成&#xff1a;哈希表&#xff08;DictHashTable&#xff09;&#xff0c;哈希节点(DictEntry)&#xff0c;字典&#xff08;Dict&#xff09…

【docker】centos7安装harbor

目录 零、前提一、下载离线包二、安装三、访问四、开机自启 零、前提 1.前提是已经安装了docker和docker-compose 一、下载离线包 1. csdn资源&#xff1a;harbor-offline-installer-v2.10.0.tgz 2. 百度云盘&#xff08;提取码&#xff1a;ap3t&#xff09;&#xff1a;harbo…

Nvidia Jetson AGX Orin使用CAN与底盘通信(ROS C++ 驱动)

文章目录 一、Nvidia Jetson AGX Orin使用CAN通信1.1 CAN使能配置修改GPIO口功能1.2 can收发测试 二、通过CAN协议编写CAN的SocketCan ROS1驱动程序2.1 通讯协议2.2 接收数据节点2.3 发送数据节点2.4 功能包配置 三、ROS2驱动程序 一、Nvidia Jetson AGX Orin使用CAN通信 参考…

python股票分析挖掘预测技术指标知识之蜡烛图指标(6)

本人股市多年的老韭菜&#xff0c;各种股票分析书籍&#xff0c;技术指标书籍阅历无数&#xff0c;萌发想法&#xff0c;何不自己开发个股票预测分析软件&#xff0c;选择python因为够强大&#xff0c;它提供了很多高效便捷的数据分析工具包。 我们已经初步的接触与学习其中数…

Java中的String类:深入分析与高级应用

Java中的String类&#xff1a;深入分析与高级应用 1. String类基础1.1 概述1.2 不可变性的好处1.3 字符串常量池 2. 创建String对象3. String类常用方法4. 内存管理4.1 字符串常量池4.2 intern方法 5. String与StringBuilder/StringBuffer6. 性能考虑7. 结论 Java中的String类是…

【Bootstrap学习 day14】

分页 分页是通过将内容分成单独的页面来组织内容的过程&#xff0c;分页导航一般用于文章列表页&#xff0c;下载列表、图片列表等&#xff0c;由于数据很多&#xff0c;不可能在一页显示&#xff0c;一般分页导航包括上一页&#xff0c;下一页、数字页码等。 基础的分页 要创…