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

news2024/9/22 5:34:09

前言

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.coloradmin.cn/o/2122709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C:题目介绍

一、算天数 1.题目: kiki向获得某年某月有多少天,请帮他编程实现。输入年份和月份,计算这一年这个月有多少天。 输入描述: 多组输入,一行有两个整数,分别表示年份和月份,用空格分隔。 输出…

Python 从入门到实战13(字符串简介)

我们的目标是:通过这一套资料学习下来,通过熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。 上篇文章我们通过举例学习了流程控制语句中的循环语句。今天继续讨…

【机器学习】--- 逻辑回归算法

目录 逻辑回归基础1. 概述2.优点与缺点 逻辑回归的理论解释1.问题背景2. S i g m o i d Sigmoid Sigmoid函数3.决策边界4.损失函数 正则化1.L1正则化2.L2正则化 逻辑回归基础 1. 概述 逻辑回归是机器学习的一种分类算法,主要运用于二分类问题。将线性回归的结果&a…

day-52 三数之和

思路 双指针&#xff1a;确定最小的那个数&#xff08;i0<i<nums.length-2&#xff09;&#xff0c;剩下两个数可以利用双指针的思想。当最小的那个数大于零时&#xff0c;可以直接返回&#xff0c;因为后面的不可能还有满足题意的组合。 解题过程 为了所有满足题意的组…

async、await、promise异步操作详解

一、async、await、Promise使用介绍 当然&#xff01;在 TypeScript 中&#xff0c;Promise 的使用可以涉及多个方面&#xff0c;包括基础用法、类型系统、异步操作的错误处理以及高级用法等。下面我会详细讲解这些内容。 1. Promise 的基本概念 Promise 是一种用于处理异步操…

StorageSync数据缓存API

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

git cz 规范化 git commit 格式

git cz 规范化 git commit 格式 npm install git-cz --save-devnpm install commitizen --save-devnpm install cz-customizable --save-dev // 这是package.json自动生成的 "config": {"commitizen": {"path": "./node_modules/cz-custo…

《OpenCV计算机视觉》—— 图像金字塔

文章目录 什么是图像金字塔&#xff1f;一、定义与基本原理二、主要类型三、构建过程四、应用领域 图像金字塔中的下采样和上采样一、下采样&#xff08;Downsampling&#xff09;二、上采样&#xff08;Upsampling&#xff09;三、总结 代码实现 什么是图像金字塔&#xff1f;…

[进阶]面向对象之多态(二)

文章目录 多态调用成员的特点多态的优势和弊端 多态调用成员的特点 变量调用:编译看左边,运行也看左边方法调用:编译看左边,运行看右边 多态的优势和弊端 优势&#xff1a; 在多态形式下&#xff0c;右边对象可以实现解耦合&#xff0c;便于扩展和维护定义方法的时候&…

【MySQL】查询表中重复数据、模糊查询列信息、快速copy表数据(1)

一、SQL查询重复的数据&#xff1a; 1、SQL格式&#xff1a; Select * From 数据表 Where 重复记录字段 in ( select 重复记录字段 From 数据表 Group By 重复记录字段 Having Count(重复记录字段)>1) 2、举例&#xff1a; 在这个patient_member_info表中&#xff0c;我们…

kkFileView PDF Image Mode Preview BUG

kkFileView PDF & Image Mode Preview BUG lazyload.js officePicture.ftl pdf.ftl kkFileView getCorsFile?urlPath 会触发SSRF漏洞 kkFileView SSRF-CSDN博客 commonHeader.ftl initWaterMark() 修改代码的工作量&#xff0c;主要是先部署项目&#xff0c;解…

2023年408真题计算机网络篇

https://zhuanlan.zhihu.com/p/6954228062023年网络规划设计师上午真题解析TCP流量计算_哔哩哔哩_bilibili 1 1在下图所示的分组交换网络中&#xff0c;主机H1和H2通过路由器互联&#xff0c;2段链路的数据传输速率为100 Mb/s、时延带宽积 &#xff08;即单向传播时延带宽&am…

计算机毕业设计 家校互联管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

【Linux实践】实验一:Linux系统安装与启动

【Linux实践】实验一&#xff1a;Linux系统安装与启动 实验目的实验内容实验步骤及结果1. 下载VMware2. 下载 Linux 操作系统3. 在VMware中安装Ubuntu系统4. 配置Ubuntu系统5. 关机 实验目的 1.掌握Linux系统的安装过程和简单配置方法。 2.掌握与Linux相关的多操作系统的安装方…

centos挂载fat32和ntfs文件系统u盘

centos挂载u盘 一、 挂载fat32文件系统u盘1. 查看u盘的文件系统2. 查看系统是否识别到u盘3. 挂载fat32文件系统u盘 二、挂载ntfs文件系统u盘1. 检查u盘文件系统&#xff08;忽略&#xff09;2. 查看系统是否识别到u盘3. 挂载ntfs文件系统3.1. 下载ntfs-3g组件3.2. 挂载u盘 一、…

嵌入式day42

framebuffer&#xff1a;帧缓冲、帧缓存 Linux内核为显示提供的一套应用程序接口&#xff08;驱动内核支持&#xff09; 分辨率&#xff1a;像素点的总和 像素点&#xff1a; 显示屏&#xff1a;800*600&#xff08;横向有800个像素点&#xff0c;纵向有600个像素点&#x…

【笔记】1.1 拉伸力-伸长(延伸)曲线和应力-应变曲线

文章目录 拉伸力-伸长&#xff08;延伸&#xff09;曲线低碳钢的拉伸力-伸长&#xff08;延伸&#xff09;曲线公称应力公称应变真应力真应变公称应力和真应力、公称应变和真应变的关系 应力-应变曲线公称应力-公称应变曲线真应力-真应变曲线 拉伸力-伸长&#xff08;延伸&…

Unity1 Prefab

修改预设体 进入预设体面板来改 在Hierarchy中可以给预制体添加对象 第一种方法&#xff1a;添加了之后把Hierarchy中的预制体拖到Project中的预制体上 就可以修改原本的预制体 第二种方法&#xff1a;添加了之后在inspector中 点revert 就是重置所有预制体 添加的就没有…

Docker基本管理--Dockerfile镜像制作(Docker技术集群与应用)

容器端口映射&#xff1b; 容器间通信&#xff1b; 容器数据卷&#xff1b; DockerFile; 容器端口映射: 实验环境&#xff1a;紧接着之前的快照&#xff0c;将该文件夹拉取进去&#xff1b; 然后执行导入的脚本&#xff0c;会将该目录下所有打包好的镜像文件导入进入。 然后进…

containerd二进制安装

文章目录 安装版本&#xff08;截止2024年9月10日&#xff09;方式1&#xff1a;yum安装&#xff08;不推荐&#xff09;设置主机名设置IP获取阿里YUM源查询containerd安装验证与启动服务测试命令 方式2&#xff1a;二进制安装&#xff08;推荐&#xff09;安装之前先了解conta…