【NVMe SSD寄存器、数据结构】NVMe Controller 重要寄存器、SSD内部跟NVMe相关的重要数据结构解析

前言

NVMe Controller会将一些重要的信息(NVMe控制器的能力,状态,Admin SQ, CQ地址等)直接放在NVMe寄存器中,另一部分(跟SSD比较相关的)信息会放置在SSD内部,并最终通过Admin NVMe CMD去设置或者获取。

NVMe寄存器

NVMe寄存器地址映射在PCIe Bar寄存器中。NVMe寄存器的偏移表如下:
在这里插入图片描述

1. Controller Capabilities

[15:0] 表示Maximum Queue Entries Supported,代表这个Controller可以支持的Queue的深度多大。这里的值为0x03FF,表示此controller的IO SQ, CQ队列深度为1024。该字段表示控制器支持的最大单个队列大小。对于基于PCIe的NVMe实现,此值适用于主机创建的I/O提交队列和I/O完成队列。
[16] Contiguous Queues Required (CQR) (RO), 表示Contiguous Queues Required,表示host在create I/O SQ 和 CQ的時候,是否必須提供物理连续的内存。
[18:17] Arbitration Mechanism Supported (AMS) (RO), 仲裁机制支持(AMS) (RO), 表示控制器支持的可选仲裁机制。
[34:31] Doorbell Stride(RO), 每个提交队列和完成队列门铃寄存器的大小为32位。这个寄存器指示门铃寄存器之间的间隔。步幅被指定为(2 ^ (2 + DSTRD))字节。值0h表示4字节的步幅,每个寄存器之间没有保留空间。
[35] 表示控制器是否支持NVM子系统复位特性。如果控制器支持NVM子系统复位功能,则该位设置为“1”。如果控制器不支持NVM子系统复位特性,则该位清除为’ 0’。
[43:36] Command Sets Supported (RO), 该字段表示控制器支持的I/O命令集。如果一个位被设置为’ 1 ‘,则支持相应的I/O命令集。如果某个位被清除为’ 0 ',则不支持相应的I/O命令集。如果不支持I/O命令集,则将第44位设置为“1”。
[50:47] Memory Page Size Minimum (RO), 该字段表示控制器支持的最小主机内存页面大小。最小内存页大小是(2 ^ (12 + MPSMIN))。主机不能在CC.MPS中配置小于此值的内存页大小。
[54:51] Memory Page Size Maximum (RO), 该字段表示控制器支持的最大主机内存页面大小。最大内存页大小是(2 ^ (12 + MPSMAX))。主机不能在CC.MPS中配置大于此值的内存页大小。

2. Version

[7:0] Tertiary Version Number(TER)
[15:8] Minor Version Number (MNR) (RO)
[31:16] Major Version Number (MJR) (RO)
该寄存器表示控制器实现支持的NVM Express基本规范的主要、次要和第三个版本。

3. Controller Configuration

这个寄存器修改控制器的设置。主机软件需要将仲裁机制(CC.AMS)、内存页面大小(CC.MPS)和命令集(CC.CSS)设置为有效值,然后通过将CC.EN设置为“1”使能控制器。在初始化I/O完成队列入口大小(CC.IOCQES)和I/O提交队列入口大小(CC.IOSQES)之前尝试创建I/O队列应该导致控制器终止创建I/O完成队列命令或创建I/O提交队列命令,状态码为无效队列大小。
[0] Enable
[6:4] I/O Command Set Selected. 该字段指定选择的I/O命令集。主机软件只能选择一个支持的I/O命令集,如CAP.CSS所示。该字段只能在禁用控制器(CC.EN清除为’ 0 ‘)时更改。所选择的I/O命令集应用于所有I/O提交队列。如果“CSS”字段中第44位被设置为“1”,则111b表示只支持Admin命令集,不支持I/O命令集或I/O命令集特定的Admin命令。当只支持管理命令集时,在I/O提交队列上提交的任何命令和在Admin提交队列上提交的任何I/O命令集特定的管理命令都以无效命令操作码状态完成。如果命令集支持(CSS)字段中的第44位被清除为’ 0 ',则设置为3b’000.
[10:7] Memory Page Size (MPS) (RW). 该字段表示主机内存页面大小。内存页大小为(2 ^ (12 + MPS))。因此,最小主机内存页大小为4 KiB,最大主机内存页大小为128 MiB。主机软件设置的值应该是CAP.MPSMAX和CAP.MPSMIN字段所支持的值。该字段描述用于PRP表项大小的值。只有当EN被清除为“0”时,该字段才能被修改。
[13:11] Arbitration Mechanism Selected (AMS) (RW). 该字段选择要使用的仲裁机制。只有当EN被清除为“0”时,这个值才会被改变。主机软件应仅将此字段设置为CAP.AMS中指示的支持仲裁机制。如果该字段被设置为不支持的值,则行为未定义。
[15:14] Shutdown Notification (SHN) (RW)
[19:16] I/O Submission Queue Entry Size (IOSQES) (RW) .此字段定义用于所选I/O命令集的I/O提交队列条目大小。对于每个I/O命令集,该字段的所需值和最大值在图SSD中的Identify Controller数据结构中的SQES字段中指定。该值以字节为单位,指定为2的幂(2^n)。
[23:20] I/O Completion Queue Entry Size (IOCQES) (RW) .此字段定义用于所选I/O命令集的I/O提交队列条目大小。对于每个I/O命令集,该字段的所需值和最大值在图SSD中的Identify Controller数据结构中的CQES字段中指定。该值以字节为单位,指定为2的幂(2^n)。

4. Controller Status

[0] Ready (RDY) (RO). 在CC.EN设置为“1”后,当控制器准备接受提交队列尾部门铃写入时,此位被设置为“1”。一旦控制器准备重新启用,当CC.EN被清除为“0”时,该位将被清除为“0”。在CC.EN位设置为“1”之后,在此位设置为“1”之前,不会向控制器提交命令。不遵循这一要求将产生未定义的结果。主机软件在将CC.EN从先前的值“0”设置为“1”后,至少需要等待CAP.TO秒才能将该位设置为“1”。

5. Admin Queue Attributes

[11:0] Admin Submission Queue Size (ASQS) (RW). 定义条目中管理提交队列的大小。参考4.1.3节。当该字段被清除为0h时启用控制器将产生未定义的结果。Admin Submission Queue的最小大小是两个条目。Admin Submission Queue的最大大小是4,096个条目。这是一个基于0的值。这里设置为256。
[27:16] Admin Completion Queue Size (ACQS) (RW). 在条目中定义管理完成队列的大小。当该字段被清除为0h时启用控制器将产生未定义的结果。管理完成队列的最小大小是两个条目。Admin Completion Queue的最大大小是4,096个条目。这是一个基于0的值。

6. Admin Submission Queue Base Address

该字段为Admin Submission Queue指定64位物理地址。此地址应与内存页对齐(基于CC.MPS中的值)。所有Admin Command,包括创建I/O提交队列和I/O完成队列,都应提交到该队列。

7. Admin Completion Queue Base Address

该字段为Admin Completion Queue指定64位物理地址。此地址应与内存页对齐(基于CC.MPS中的值)。所有Admin Command,包括创建I/O提交队列和I/O完成队列,都应提交到该队列。

总结:NVMe寄存器中存放ASQ, ACQ, I/O SQ, I/O CQ中的队列深度,以及I/O SQ, I/O CQ中的Entry大小;ASQ ACQ中的Entry找不到在哪里设置,猜测可能是固定64字节和16字节;ASQ ACQ在主机内存中的位置;支持的NVMe 命令集;内存页面大小;复位信息;命令的仲裁机制;该控制器是否准备就绪;关机通知。

SSD内部数据结构——Identify Controller Data Structure (ICDS)

ICDS主要是描述Controller的一些信息和能力

struct nvme_id_ctrl {__le16 vid;__le16 ssvid;char sn[20];char mn[40];char fr[8];__u8 rab;__u8 ieee[3];__u8 cmic;__u8 mdts;__le16 cntlid;__le32 ver;__le32 rtd3r;__le32 rtd3e;__le32 oaes;__le32 ctratt;__u8 rsvd100[28];__le16 crdt1;__le16 crdt2;__le16 crdt3;__u8 rsvd134[122];__le16 oacs;__u8 acl;__u8 aerl;__u8 frmw;__u8 lpa;__u8 elpe;__u8 npss;__u8 avscc;__u8 apsta;__le16 wctemp;__le16 cctemp;__le16 mtfa;__le32 hmpre;__le32 hmmin;__u8 tnvmcap[16];__u8 unvmcap[16];__le32 rpmbs;__le16 edstt;__u8 dsto;__u8 fwug;__le16 kas;__le16 hctma;__le16 mntmt;__le16 mxtmt;__le32 sanicap;__le32 hmminds;__le16 hmmaxd;__u8 rsvd338[4];__u8 anatt;__u8 anacap;__le32 anagrpmax;__le32 nanagrpid;__u8 rsvd352[160];__u8 sqes;__u8 cqes;__le16 maxcmd;__le32 nn;__le16 oncs;__le16 fuses;__u8 fna;__u8 vwc;__le16 awun;__le16 awupf;__u8 nvscc;__u8 nwpc;__le16 acwu;__u8 rsvd534[2];__le32 sgls;__le32 mnan;__u8 rsvd544[224];char subnqn[256];__u8 rsvd1024[768];__le32 ioccsz;__le32 iorcsz;__le16 icdoff;__u8 ctrattr;__u8 msdbd;__u8 rsvd1804[244];struct nvme_id_power_state psd[32];__u8 vs[1024];
};

1. mdts字段

代表Maximum Data Transfer Size,表示一次NVMe IO最多能传输多少数据。

2. sqes字段

表示I/O SQ 的一个entry为多少bytes,表示为2^(sqes)

3. cqes字段

表示I/O CQ 的一个entry为多少bytes,表示为2^(cqes)

SSD内部数据结构——Identify Namespace Data Structure (INDS)

INDS是给HOST回报namespace中的一些信息及能力

struct nvme_id_ns {__le64 nsze;__le64 ncap;__le64 nuse;__u8 nsfeat;__u8 nlbaf;__u8 flbas;__u8 mc;__u8 dpc;__u8 dps;__u8 nmic;__u8 rescap;__u8 fpi;__u8 dlfeat;__le16 nawun;__le16 nawupf;__le16 nacwu;__le16 nabsn;__le16 nabo;__le16 nabspf;__le16 noiob;__u8 nvmcap[16];__le16 npwg;__le16 npwa;__le16 npdg;__le16 npda;__le16 nows;__u8 rsvd74[18];__le32 anagrpid;__u8 rsvd96[3];__u8 nsattr;__le16 nvmsetid;__le16 endgid;__u8 nguid[16];__u8 eui64[8];struct nvme_lbaf lbaf[16];__u8 rsvd192[192];__u8 vs[3712];
};

1. nlbaf字段

表示此命名空间可以支持nlbaf中 LBA 格式

2. flbas

表示当前命名空间使用第flbas个 LBA格式

3. nvme_lbaf 中的 nsze字段

定义了命名空间在逻辑块中的总大小(LBA 0到n-1)。

4. nvme_lbaf 中的 ncap字段

字段定义了在任何时间点可以分配的逻辑块的最大数目。

5. nvme_lbaf 中的 nuse字段

字段定义命名空间中当前分配的逻辑块的数量。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UML的图及其他图补充

一、UML图 1.类图 ‌类图‌是统一建模语言(UML)中的一种静态结构图,主要用于描述软件系统的静态结构。它显示了模型中的类、类的内部结构以及它们与其他类的关系。类图是面向对象建模的主要组成部分,用于对系统的词汇进行建模、对…

C++day7

一、思维导图 二、模板类实现myStack和myQueue #include <iostream>using namespace std;template <typename T> class MyStack { private:T* arr;int capacity;int topIndex;public:MyStack(int size);~MyStack();void push(const T& value);void pop();T to…

无线通信 | 射频校准的概念、作用和步骤以及相关仪器

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 本节目录 一、射频校准 1、射频校…

面向物联网基础的智能农业环境的节能边缘-雾-云计算架构

这篇论文的标题是《Energy-Efficient Edge-Fog-Cloud Architecture for IoT-Based Smart Agriculture Environment》&#xff0c;作者是Hatem A. Alharbi和Mohammad Aldossary&#xff0c;发表在IEEE Access期刊上。论文的主要内容可以概括为以下几个部分&#xff1a; 摘要&am…

戏曲文化苑管理系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;操作日志管理&#xff0c;基础数据管理&#xff0c;公告管理&#xff0c;戏曲管理&#xff0c;用户管理&#xff0c;轮播图信息 微信端账号功能包括&#xff1a;系统首页&#…

vue 使用vue-quill-editor 富文本添加源码模式,查看源码功能和表格功能

今天接到个需求&#xff0c;在富文本中增加查看源码和增加表格功能&#xff0c;感觉这种功能手拿把掐&#xff0c;但是奈于平时沉迷于移动端有段时间没写pc了&#xff0c;看了下官方感觉一个头两个大&#xff0c;于是在茫茫文档中各种借鉴&#xff08;抄袭&#xff09;完成了功…

口袋微店多店铺管理解决方案:甜羊浏览器的应用

#### 前言 随着移动互联网的快速发展&#xff0c;口袋微店成为了众多商家首选的在线销售平台。然而&#xff0c;对于拥有多个口袋微店店铺的商家而言&#xff0c;如何高效地管理这些店铺成为了一大挑战。为了帮助商家解决这一难题&#xff0c;我们推荐使用甜羊浏览器&#xff…

局域网一套键鼠控制两台电脑(台式机和笔记本)

服务端&#xff08;有键盘和鼠标的电脑作为服务端&#xff09; 下载软件 分享文件&#xff1a;BarrierSetup-2.3.3.exe 链接&#xff1a;https://pan.xunlei.com/s/VO66rAZkzxTxVm-0QRCJ33mMA1?pwd4jde# 配置服务端 一&#xff0c; 二&#xff0c; 客户端屏幕名称一定要和…

携手浙商证券、华锐技术,共话交易技术的创新与应用

秉承“虚已者进德之基&#xff0c;求同存异谓之共赢”的理念&#xff0c;浙商证券联合非凸科技、华锐技术于8月28日在深圳举办了“量化机遇汇浙&#xff0c;交易技术共商”鑫管家私募沙龙纷享会。此次活动汇聚了众多优秀管理人与资方代表&#xff0c;分享前沿观点&#xff0c;探…

机器学习-逻辑回归原理及其公式

逻辑回归&#xff08;Logistic Regression&#xff09;是一种广泛应用于分类任务的统计学方法&#xff0c;尤其是在二分类问题中表现尤为突出。尽管它的名字中包含“回归”&#xff0c;但实际上逻辑回归是一种分类算法。逻辑回归的目标是预测一个样本属于某一类别的概率&#x…

链表题目训练

https://leetcode.cn/problems/remove-linked-li​​​​​​st-elements/description/第一题&#xff1a;移除链表元素 https://leetcode.cn/problems/remove-linked-li​​​​​​st-elements/description/ 第二题&#xff1a;反转链表 https://leetcode.cn/problems/reve…

Fisco Bcos 2.11.0通过网络和本地二进制文件搭建单机节点联盟链网络(搭建你的第一个区块链网络)

Fisco Bcos 2.11.0通过网络和本地二进制文件搭建单机节点联盟链网络(搭建你的第一个区块链网络) 文章目录 Fisco Bcos 2.11.0通过网络和本地二进制文件搭建单机节点联盟链网络(搭建你的第一个区块链网络)前言一、Ubuntu依赖安装二、创建操作目录, 下载build_chain.sh脚本2.1 先…

超越IP-Adapter!阿里提出UniPortrait,可通过文本定制生成高保真的单人或多人图像。

阿里提出UniPortrait&#xff0c;能根据用户提供的文本描述&#xff0c;快速生成既忠实于原图又能灵活调整的个性化人像&#xff0c;用户甚至可以通过简单的句子来描述多个不同的人物&#xff0c;而不需要一一指定每个人的位置。这种设计大大简化了用户的操作&#xff0c;提升了…

我的可视化表达引擎真高可用了

原来有这么多时间 六月的那么一天&#xff0c;天气比以往时候都更凉爽&#xff0c;媳妇边收拾桌子&#xff0c;边漫不经心的对我说&#xff1a;你最近好像都没怎么阅读了。 正刷着新闻我&#xff0c;如同被一记响亮的晴空霹雳击中一般&#xff0c;不知所措。是了&#xff0c;最…

记一次knife4j文档请求异常 SyntaxError: Unexpected token ‘<‘, ... is not valid JSON

knife4j页面报错问题定位 前几天开发新接口&#xff0c;开发完成后想使用knife4j测试一下接口功能&#xff0c;突然发现访问页面报错提示&#xff1a;knife4j文档请求异常&#xff0c;但之前运行还是正常的&#xff0c;想想会不会与升级依赖有关系&#xff0c;启动其他微服务发…

如何优化谷歌排名更有效?

要想提高排名&#xff0c;首先得从用户的角度出发。要想他们在搜索时最关心什么问题&#xff0c;急需解决哪些痛点&#xff0c;之后要做的就是创建GHA高质量内容&#xff0c;创建内容时尽量深入探讨这些问题&#xff0c;而不是泛泛而谈。内容要自然&#xff0c;尽量避免过多的关…

StorageSync数据缓存API

uni.setStorageSyncs参数:将 data 存储在本地缓存中指定的 key 中&#xff0c;会覆盖掉原来该 key 对应的内容&#xff0c;这是一个同步接口。 uni.setStorageSync函数里面写两个参数,分别是key和值,两个参数名称可以随便取,如果有同名的key,那么后面key的值会覆盖掉前面key的值…

基于C#的UDP协议消息传输

1. 服务端 internal class Program{static void Main(string[] args){//1.创建SocketSocket socketServer new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);//2.绑定IP、端口号EndPoint endPoint new IPEndPoint(IPAddress.Parse("127.0.0.1&…

Deep Ocr

1.圈出内容,文本那里要有内容.然后你保存,并导出数据集. 2.找出deep_ocr_recognition_training_workflow.hdev 文件.修改“DatasetFilename : Test.hdict” 310行 write_deep_ocr (DeepOcrHandle, BestModelDeepOCRFilename) 3.推理test.hdev 但发现很慢&#xff0c;没有mlp…

深入RabbitMQ世界:探索3种队列、4种交换机、7大工作模式及常见概念

文章目录 文章导图RabbitMQ架构及相关概念四大核心概念名词解读 七大工作模式及四大交换机类型0、前置了解-默认交换机DirectExchange1、简单模式(Simple Queue)-默认DirectExchange2、 工作队列模式(Work Queues)-默认DirectExchange3、发布/订阅模式(Publish/Subscribe)-Fano…