使用nvme-cli学习NVMe协议篇一:nvme id-ctrl

本节最好搭配NVMe 1.4协议 5.15.2.2 Identify Controller data structure (CNS 01h)节享用
https://nvmexpress.org/wp-content/uploads/NVM-Express-1_4c-2021.06.28-Ratified.pdf

nvme id-ctrl命令的空输出为如下,该命令的用途:
向给定NVMe设备发送标识主控命令,并以人类可读或二进制格式报告有关指定主控的信息。如果需要,还可以在十六进制转储中返回供应商特定的主控属性。

-v参数: dump供应商二进制厂商字段
-o参数:指定输出格式,可指定三种:normal\json\binary
-b参数:以二进制格式显示识别主控信息
-H参数:对人阅读友好的方式识别主控信息

sudo nvme id-ctrl  -H
id-ctrl: Invalid argument
Usage: nvme id-ctrl <device> [OPTIONS]

Send an Identify Controller command to the given device and report
information about the specified controller in human-readable or binary
format. May also return vendor-specific controller attributes in hex-dump if
requested.

Options:
  [  --vendor-specific, -v ]            --- dump binary vendor field
  [  --output-format=<FMT>, -o <FMT> ]  --- Output format: normal|json|binary
  [  --raw-binary, -b ]                 --- show identify in binary format
  [  --human-readable, -H ]             --- show identify in readable format

首先,看看PCI总线上是否有任何NVMe主控。我这里使用的是三星PM9A3 U.2接口 1.92TB容量 PCIe4.0(Model Number: MZQL21T9HCJR-00A07) NVMe SSD
https://semiconductor.samsung.com/ssd/datacenter-ssd/pm9a3/mzql21t9hcjr-00a07/

$ lspci -nn | grep NVMe

22:00.0 Non-Volatile memory controller [0108]: Samsung Electronics Co Ltd NVMe SSD Controller PM9A1/PM9A3/980PRO [144d:a80a]

看一下是否还有其他NVMe设备。看输出是有一个字符设备(nvme0)和四个块设备。

$ ls -l /dev/nvme*

crw------- 1 root root 240,   0 Dec  4 06:50 /dev/nvme0
brw-rw---- 1 root disk 259,   0 Dec  4 06:50 /dev/nvme0n1
brw-rw---- 1 root disk 259,   1 Dec  4 06:50 /dev/nvme0n1p1
brw-rw---- 1 root disk 259,   2 Dec  4 06:50 /dev/nvme0n1p2
crw------- 1 root root  10, 123 Dec  4 06:50 /dev/nvme-fabrics

$ lsblk

NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0         7:0    0 61.9M  1 loop /snap/core20/1405
loop1         7:1    0 79.9M  1 loop /snap/lxd/22923
loop2         7:2    0 44.7M  1 loop /snap/snapd/15534
nvme0n1     259:0    0  1.7T  0 disk 
├─nvme0n1p1 259:1    0    1G  0 part /boot/efi
└─nvme0n1p2 259:2    0  1.7T  0 part /

由此可以确认nvme0n1是该机器上唯一的NVMe SSD

其实,可以直观的使用nvme list命令输出本机上的NVMe SSD

$ sudo nvme list

Node                  SN                   Model                                    Namespace Usage                      Format           FW Rev  
--------------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- --------
/dev/nvme0n1          S63SNE0R509582       SAMSUNG MZQL21T9HCJR-00B7C               1          54.12  GB /   1.92  TB    512   B +  0 B   GDC51C2Q

这是从sysfs中生成的(例如/sys/class/nvme/...)

$ ls /sys/class/nvme/nvme0/

address  cntrltype  dev     firmware_rev  kato   ng0n1      nvme0n1  queue_count        reset_controller  sqsize  subsysnqn  transport
cntlid   dctype     device  hwmon1        model  numa_node  power    rescan_controller  serial            state   subsystem  uevent


当向NVMe主控发送Identify Admin命令,将返回4096字节的数据输出。(-H使其对人友好)

$ sudo nvme id-ctrl -H /dev/nvme0

NVME Identify Controller:
vid       : 0x144d
ssvid     : 0x144d
sn        : S63SNE0R509582      
mn        : SAMSUNG MZQL21T9HCJR-00B7C              
fr        : GDC51C2Q
rab       : 2
ieee      : 002538
cmic      : 0
  [3:3] : 0	ANA not supported
  [2:2] : 0	PCI
  [1:1] : 0	Single Controller
  [0:0] : 0	Single Port

mdts      : 9
cntlid    : 0x6
ver       : 0x10400
rtd3r     : 0x7a1200
rtd3e     : 0x7a1200
oaes      : 0x300
  [31:31] : 0	Discovery Log Change Notice Not Supported
  [27:27] : 0	Zone Descriptor Changed Notices Not Supported
  [15:15] : 0	Normal NSS Shutdown Event Not Supported
  [14:14] : 0	Endurance Group Event Aggregate Log Page Change Notice Not Supported
  [13:13] : 0	LBA Status Information Notices Not Supported
  [12:12] : 0	Predictable Latency Event Aggregate Log Change Notices Not Supported
  [11:11] : 0	Asymmetric Namespace Access Change Notices Not Supported
  [9:9] : 0x1	Firmware Activation Notices Supported
  [8:8] : 0x1	Namespace Attribute Changed Event Supported

ctratt    : 0x80
  [15:15] : 0	Extended LBA Formats Not Supported
  [14:14] : 0	Delete NVM Set Not Supported
  [13:13] : 0	Delete Endurance Group Not Supported
  [12:12] : 0	Variable Capacity Management Not Supported
  [11:11] : 0	Fixed Capacity Management Not Supported
  [10:10] : 0	Multi Domain Subsystem Not Supported
  [9:9] : 0	UUID List Not Supported
  [7:7] : 0x1	Namespace Granularity Supported
  [5:5] : 0	Predictable Latency Mode Not Supported
  [4:4] : 0	Endurance Groups Not Supported
  [3:3] : 0	Read Recovery Levels Not Supported
  [2:2] : 0	NVM Sets Not Supported
  [1:1] : 0	Non-Operational Power State Permissive Not Supported
  [0:0] : 0	128-bit Host Identifier Not Supported

rrls      : 0
cntrltype : 0
  [7:2] : 0	Reserved
  [1:0] : 0	Controller type not reported
fguid     : 
crdt1     : 0
crdt2     : 0
crdt3     : 0
nvmsr     : 1
  [1:1] : 0	NVM subsystem Not part of an Enclosure
  [0:0] : 0x1	NVM subsystem part of an Storage Device

vwci      : 0
  [7:7] : 0	VPD Write Cycles Remaining field is Not valid.
  [6:0] : 0	VPD Write Cycles Remaining 

mec       : 1
  [1:1] : 0	NVM subsystem Not contains a Management Endpoint on a PCIe port
  [0:0] : 0	NVM subsystem Not contains a Management Endpoint on an SMBus/I2C port

oacs      : 0x5f
  [10:10] : 0	Lockdown Command and Feature Not Supported
  [9:9] : 0	Get LBA Status Capability Not Supported
  [8:8] : 0	Doorbell Buffer Config Not Supported
  [7:7] : 0	Virtualization Management Not Supported
  [6:6] : 0x1	NVMe-MI Send and Receive Supported
  [5:5] : 0	Directives Not Supported
  [4:4] : 0x1	Device Self-test Supported
  [3:3] : 0x1	NS Management and Attachment Supported
  [2:2] : 0x1	FW Commit and Download Supported
  [1:1] : 0x1	Format NVM Supported
  [0:0] : 0x1	Security Send and Receive Supported

acl       : 7
aerl      : 3
frmw      : 0x17
  [5:5] : 0	Multiple FW or Boot Update Detection Not Supported
  [4:4] : 0x1	Firmware Activate Without Reset Supported
  [3:1] : 0x3	Number of Firmware Slots
  [0:0] : 0x1	Firmware Slot 1 Read-Only

lpa       : 0xe
  [6:6] : 0	Telemetry Log Data Area 4 Not Supported
  [5:5] : 0	LID 0x0, Scope of each command in LID 0x5, 0x12, 0x13 Not Supported
  [4:4] : 0	Persistent Event log Not Supported
  [3:3] : 0x1	Telemetry host/controller initiated log page Supported
  [2:2] : 0x1	Extended data for Get Log Page Supported
  [1:1] : 0x1	Command Effects Log Page Supported
  [0:0] : 0	SMART/Health Log Page per NS Not Supported

elpe      : 63
npss      : 1
avscc     : 0x1
  [0:0] : 0x1	Admin Vendor Specific Commands uses NVMe Format

apsta     : 0
  [0:0] : 0	Autonomous Power State Transitions Not Supported

wctemp    : 353
 [16:0] : 80 C (353 Kelvin)	Warning temperature (WCTEMP)

cctemp    : 356
 [16:0] : 83 C (356 Kelvin)	Critical temperature (CCTEMP)

mtfa      : 0
hmpre     : 0
hmmin     : 0
tnvmcap   : 1920383410176
unvmcap   : 0
rpmbs     : 0
 [31:24]: 0	Access Size
 [23:16]: 0	Total Size
  [5:3] : 0	Authentication Method
  [2:0] : 0	Number of RPMB Units

edstt     : 35
dsto      : 1
fwug      : 0
kas       : 0
hctma     : 0
  [0:0] : 0	Host Controlled Thermal Management Not Supported

mntmt     : 0
mxtmt     : 0
sanicap   : 0x3
  [31:30] : 0	Additional media modification after sanitize operation completes successfully is not defined
  [29:29] : 0	No-Deallocate After Sanitize bit in Sanitize command Supported
    [2:2] : 0	Overwrite Sanitize Operation Not Supported
    [1:1] : 0x1	Block Erase Sanitize Operation Supported
    [0:0] : 0x1	Crypto Erase Sanitize Operation Supported

hmminds   : 0
hmmaxd    : 0
nsetidmax : 0
endgidmax : 0
anatt     : 0
anacap    : 0
  [7:7] : 0	Non-zero group ID Not Supported
  [6:6] : 0	Group ID does not change
  [4:4] : 0	ANA Change state Not Supported
  [3:3] : 0	ANA Persistent Loss state Not Supported
  [2:2] : 0	ANA Inaccessible state Not Supported
  [1:1] : 0	ANA Non-optimized state Not Supported
  [0:0] : 0	ANA Optimized state Not Supported

anagrpmax : 0
nanagrpid : 0
pels      : 0
domainid  : 0
megcap    : 0
sqes      : 0x66
  [7:4] : 0x6	Max SQ Entry Size (64)
  [3:0] : 0x6	Min SQ Entry Size (64)

cqes      : 0x44
  [7:4] : 0x4	Max CQ Entry Size (16)
  [3:0] : 0x4	Min CQ Entry Size (16)

maxcmd    : 256
nn        : 32
oncs      : 0x5f
  [8:8] : 0	Copy Not Supported
  [7:7] : 0	Verify Not Supported
  [6:6] : 0x1	Timestamp Supported
  [5:5] : 0	Reservations Not Supported
  [4:4] : 0x1	Save and Select Supported
  [3:3] : 0x1	Write Zeroes Supported
  [2:2] : 0x1	Data Set Management Supported
  [1:1] : 0x1	Write Uncorrectable Supported
  [0:0] : 0x1	Compare Supported

fuses     : 0
  [0:0] : 0	Fused Compare and Write Not Supported

fna       : 0x4
  [3:3] : 0	FormatNVM Broadcast NSID (FFFFFFFFh) Supported
  [2:2] : 0x1	Crypto Erase Supported as part of Secure Erase
  [1:1] : 0	Crypto Erase Applies to Single Namespace(s)
  [0:0] : 0	Format Applies to Single Namespace(s)

vwc       : 0x6
  [2:1] : 0x3	The Flush command supports NSID set to FFFFFFFFh
  [0:0] : 0	Volatile Write Cache Not Present

awun      : 1023
awupf     : 7
icsvscc     : 1
  [0:0] : 0x1	NVM Vendor Specific Commands uses NVMe Format

nwpc      : 0
  [2:2] : 0	Permanent Write Protect Not Supported
  [1:1] : 0	Write Protect Until Power Supply Not Supported
  [0:0] : 0	No Write Protect and Write Protect Namespace Not Supported

acwu      : 0
ocfs      : 0
  [1:1] : 0	Controller Copy Format 1h Not Supported
  [0:0] : 0	Controller Copy Format 0h Not Supported

sgls      : 0
 [15:8] : 0	SGL Descriptor Threshold
 [1:0]  : 0	Scatter-Gather Lists Not Supported

mnan      : 0
maxdna    : 0
maxcna    : 0
subnqn    : nqn.1994-11.com.samsung:nvme:PM9A3:2.5-inch:S63SNE0R509582      
ioccsz    : 0
iorcsz    : 0
icdoff    : 0
fcatt     : 0
  [0:0] : 0	Dynamic Controller Model

msdbd     : 0
ofcs      : 0
  [0:0] : 0	Disconnect command Not Supported

ps    0 : mp:25.00W operational enlat:70 exlat:70 rrt:0 rrl:0
          rwt:0 rwl:0 idle_power:4.00W active_power:14.00W
ps    1 : mp:8.00W operational enlat:70 exlat:70 rrt:1 rrl:1
          rwt:1 rwl:1 idle_power:4.00W active_power:8.00W

字段的含义是:

vid: 是PCI供应商ID(在本实例中,是三星),与lspci输出中的0x144d是一致的。pci vendor id可以去https://pcisig.com/membership/member-companies查询。

ssvid: 是PCI子系统供应商ID。是由PCI-SGI组织认证的二级制造厂商的识别码,同样是唯一的厂商标识,不允许重名,但同一家技术厂商的VID和SVID可以重名。

SN是序列号,MN 是Model Number,是模型编码,FR是固件版本。

IEEE 是IEEE OUI Identifier,主控供应商的组织唯一标识符,可以去https://standards.ieee.org/products-programs/regauth/查询。

rab: Recommended Arbitration Burst。推荐的Arbitration Burst设置值。该值以2的幂数报告(2^n)。这与Arbitration Burst的单位是相同的。Arbitration Burst是指每轮可以从每个 Submission Queue 开始处理的候选命令的数量。

image

image

cmic: Controller Multi-Path I/O and Namespace Sharing Capabilities 是主控多路径I/O和namespace共享能力。

Bits 7:4 :保留字段
Bit 3 = 0: 不支持非对称命名空间访问报告(Asymmetric Namespace Access Reporting)。Asymmetric Namespace Access允许不同namespace之间使用不同的命名空间描述符(Namespace Descriptor),以支持不同的数据保护和安全性需求。关于ANA reporting可以查看协议8.20章节,这是个可选支持特性。
Bit 2 = 0: 主控与PCI Function相关联,不支持SR-IOV。
Bit 1 = 0: NVM subsystem port只包含单个主控。换句话说,该盘只能连接到一台主机上。多提一句,协议1.4.1节描述,一个包含多个主控的NVM子系统可能被多个host主机使用,也可能为一个主机提供多路径。
Bit 0 = 0: 主控只包含单个NVM subsystem port.
这些基本上意味着该主控上没有多路径I/O和namespace共享的支持

mdts: Maximum Data Transfer Size。是host主机和主控之间的最大数据传输大小。host不应发出超过此传输大小的命令。如果处理的命令超过传输大小,则该命令将被中止,状态为“Invalid Field in Command”。该值以最小内存页大小(CAP.MPSMIN)为单位,数值为2的幂(2n)。值0h表示对传输大小没有限制。这里mdts=9,所以29=512。在下面的可以看到最小内存页大小(MPSMIN)为4K。所以MDTS是512*4K=2048K。

cntlid:Controller ID。与主控相关联的NVM子系统的唯一主控标识符

ver: 该字段是协议中第3.1.2节中定义的版本寄存器中报告的值。符合NVMe协议1.2版或更高版本的实现应在这个字段中报告一个非零的值。在输出中,0x10400表示符合NVMe 1.4版本标准的主控
image

rtd3r: RTD3 Resume Latency。该字段表示从Runtime D3(RTD3)恢复的预期延迟,单位为微秒。值为0h表示不报告RTD3恢复延时。1微秒=10^-6秒,实例中0x7a1200=8000000微秒=8秒。

rtd3e: RTD3 Entry Latency 该字段表示进入Runtime D3(RTD3)的典型延迟,单位为微秒。值为0h表示不报告RTD3进入延时。

oaes: Optional Asynchronous Events Supported. 该字段表示主控支持的可选异步事件。在host主机软件启用之前,主控不应发送可选的异步事件。

             • Bits 31:15 协议中是保留字段,三星主控启用了Bit 31、27、15字段。增加了NVMe协议2.0的内容。

             • Bits 31:31 为0,表示主控不支持Discovery Log Change Notice。

             • Bits 27:27 为0,表示主控不支持Zone Descriptor Changed Notices。

             • Bits 15:15 为0,表示主控不支持Normal NVM Subsystem Shutdown event。

             • Bits 14:14 为0,表示主控不支持Endurance Group Event Aggregate Log Page Change Notices event。这部分内容与协议8.17章节相关。

image

             • Bits 13:13 为0,表示主控不支持LBA Status Information Notice。这一部分在协议5.21.1.21章节。

image

             • Bits 12:12 为0,表示主控不支持Predictable Latency Event Aggregate Log Change Notices。这一部分在协议8.18章节。

image

             • Bits 11:11 为0,表示主控不支持Asymmetric Namespace Access Change Notices。这一部分与协议8.20章节相关。

image

             • Bits 10:10 保留字段

             • Bits 9:9 为1,表示主控支持Firmware Activation Notices event。这一部分与协议8.20章节相关。

image

             • Bits 8:8 为1,表示主控支持Namespace Attribute Notices event and the associated Changed Namespace List log page.

image

nbsp;            • Bits 7:0 为保留字段

ctratt: Controller Attributes 该字段表示主控的属性。

             • 协议中Bits 31:10是保留字段。案例中,三星主控启用了 15:10字段,增加了NVMe协议2.0容量模型的内容

             • Bits 15:15 为0,表示主控不支持Extended LBA Formats。extended LBA指的是LBA with data and metadata。这一块的内容与NVMe end-to-end Data Protection内容相关。可以查看协议8.3章节。

             • Bits 14:14 为0,表示主控不支持Delete NVM Set。

             • Bits 13:13 为0,表示主控不支持Delete Endurance Group

             • Bits 12:12 为0,表示主控不支持Variable Capacity Management

             • Bits 11:11 为0,表示主控不支持Fixed Capacity Management

             • Bits 10:10 为0,表示主控不支持Multi Domain Subsystem

             • Bits 9:9为0,表示主控不支持UUID List。

             • Bits 8:8, 协议中是SQ Associations,该主控中无此信息。这部分内容可以查看协议8.23章节

             • Bits 7:7为1 ,表示主控支持Namespace Granularity. 这一部分内容可以查看5.15.2.12章节。
image

             • Bits 6:6,协议中是Traffic Based Keep Alive Support – TBKAS,这部分keep alive内容与NVMeoF相关,NVMe over PCIe中是非必须。看kernel中可以对PCIe进行支持。https://patchwork.kernel.org/project/linux-block/patch/1465248119-17875-9-git-send-email-hch@lst.de/

image

             • Bits 5:5,为0,表示主控不支持Predictable Latency Mode。这部分内容可以查看协议8.18章节,是非强制性feature.

             • Bits 4:4,为0,表示主控不支持Endurance Group。这部分内容可以查看协议8.17章节,是非强制性feature.

             • Bits 3:3,为0,表示主控不支持 Read Recovery Levels。这部分内容可以查看协议 8.16章节。

             • Bits 2:2,为0,表示主控不支持NVM Sets。不同的NVM Set使用的物理资源可以是独立的,每个NVM Set可以包含多个channel多个die,不同的NVM Set读写,擦除等都是相互独立互不干扰,可以提供更好的QoS

image

同一个NVM Set内部可以包含一个或者多个NS(name space)

image

             • Bits 1:1,为0,表示主控不支持Non-Operational Power State Permissive。这一部分内容在5.21.1.17章节。允许SSD在空闲状态下,执行超过额定功率的限制,执行垃圾回收等后台作业。

             • Bits 0:0,为0,表示主控不支持128-bit Host Identifier。这一部分在章节5.21.1.26.1。

rrls: Read Recovery Levels Supported 该字段表示支持的Read Recovery Levels。这部分与ctratt中的Bits 3:3字段RRL有关。为0,表示不支持。是非强制性feature。

cntrltype: Controller Type 符合协议1.4版或更高版本的实施应报告主控类型(保留值0h,不得使用)。符合早期协议版本的主控实现可能报告值0h,表示未报告主控类型。该三星主控是1.4协议版本,但是依然报告了0,令人迷惑。

fguid: FRU Globally Unique Identifier.该字段包含一个128位值,该值对于给定的FRU是全局唯一的。有关FRU的定义,需要查看NVMe-MI规范。该字段在FRU的整个生命周期内保持固定。未实现该字段时,此字段值为0

crtd1: Command Retry Delay Time 1. Do Not Retry(DNR)位在CQE中被清除0,并且CQE中Command Retry Delay(CRD)字段设置为01b,则该值表示以100毫秒为单位的命令重试延迟时间

crtd2: Command Retry Delay Time 2. Do Not Retry(DNR)位在CQE中被清除0,并且CQE中Command Retry Delay(CRD)字段设置为10b,则该值表示以100毫秒为单位的命令重试延迟时间

crtd3: Command Retry Delay Time 3. Do Not Retry(DNR)位在CQE中被清除0,并且CQE中Command Retry Delay(CRD)字段设置为11b,则该值表示以100毫秒为单位的命令重试延迟时间

协议中Bits 255:240 并没有做具体定义。是主控厂商参考nvme-mi规范自己定义。该三星主控增加了nvme-mi中nvmsrvwcimec
image

nvmsr: 对于Storage device , Identify Controller数据结构中的NVM Subsystem Report(NVMSR)字段中的NVMe storage Device(NVMESD)bit位应设置为“1”。Identify Controller数据结构的NVM Subsystem Report(NVMSR)字段中的NVMe Enclosure(NVMEE)bit位应设置为“1”。
NVMe Enclosure是一个平台、卡、模块、盒子、机架或一组盒子,可以为一个或多个NVM subsystem提供电源、冷却和机械保护。

vwci:VPD Write 命令是用来更新Vital Productr Data(VPD)。VPD是描述NVMe存储设备的FRU信息(参考IPMI平台管理FRU信息存储规范)。VPD内容应能使用VPD写入命令至少更新8次。如果VPD Write Cycles Remaining字段的初始值小于 100,那么VPD Write Cycles Remaining有效位应设置为 "1"。(参考NVMe规范中Identify
Controller数据结构的VPD Write Cycle Information字段)

mec: Management Endpoint Capabilities,

             • Bits 7:2,为保留字段

             • Bits 1:1,为0,表示NVM Subsystem不包含PCIe端口上的管理端点

             • Bits 0:0,为0,表示NVM Subsystem不包SMBus/I2C 端口上的管理端点

oacs: Optional Admin Command Support。

             • Bits 15:10,协议中是保留字段,该三星主控启用了第10bit,增加了NVMe2.0 Lockdown Command and Feature的内容。

             • Bits 10:10,为0,表示主控不支持Lockdown Command and Feature。NNVMe 2.0 引入了一项重要的新安全功能:命令组控制,使用新的 Lockdown 命令进行配置。NVMe 1.4 添加了namespace 写保护功能,允许主机系统将namespace置于写保护模式,直到明确解锁或驱动器重新启动。NVMe 2.0 的 Lockdown 允许类似的控制来禁止其他命令。这可用于将SSD盘置于允许普通读取和写入的状态,但各种管理命令被锁定,因此无法重新配置SSD盘的其他功能。与之前的写保护功能一样,此命令组控制支持设置这些限制,直到它们被明确删除,或者直到重新启动。

             • Bits 9:9,为0,表示主控不支持Get LBA Status特性。可以去协议8.22章节查看相关内容。
             Get LBA status命令允许SSD盘向主机提供一个blocks列表。在这个blocks列表中,包含了那些尝试Read或者Verify命令后可能导致不可恢复的读取错误的块。SSD可能已经在自动后台扫描中检测到了ECC错误,或者在更严重的情况下,该功能可以报告有哪些LBA受到了整个NAND通道的故障影响,从而可以避开这些区域。Get LBA Status命令还可以用于要求在返回可能不可恢复的blocks列表之前,就预先扫描选定的数据范围。

             另外,当host主机从Get LBA Status功能或发出Read或Verify命令中,收到的错误response响应中中发现损坏或丢失的数据时,该命令还可以将其他地方的数据副本(比如RAID或者备份数据)重新写入到相同的LBA中,然后正常使用这些逻辑块。SSD将在必要的时候彻底封闭受损的物理块避免再次丢失数据。

             • Bits 8:8,为0,表示主控不支持Doorbell Buffer Config。Doorbell Buffer Config 命令适用于模拟主控,通常物理 NVMe 主控不支持

             • Bits 7:7,为0,表示主控不支持Virtualization Management。 支持Virtualization Enhancements 功能的主控支持Virtualization Management命令。此命令用于以下用途:具体内容查看协议5.22和8.22章节
• 修改主主控的Flexible Resource分配;主主控支持NVMe Virtualization Enhancements、PCIe SR-IOV功能。

• 为次级主控分配Flexible Resource;

• 设置次级主控的online和offline状态

image

             • Bits 6:6,为1,表示主控支持NVMe-MI Send和Receive命令

             • Bits 5:5,为0,表示主控不支持Directives。NVMe从1.3协议开始,以 directive 的形式支持 multi-stream(例如,区分hot data、cold data),directive 机制用于实现 SSD 设备与上层软件之间的信息沟通。 stream 主要提升 garbage collection 的性能,降低SSD写放大,从而提高 SSD 的有效生命周期。
image

             • Bits 4:4,为1,表示主控支持Device Self-test。具体内容,可以查看协议5.14.1.6和8.11章节。像服务器上电自检一样,SSD在上电过程中也会做电容,DRAM等自检操作。但是一般盘上电使用之后就极少会下电,所以为了能让HOST能实时的获取盘内部部件的情况,NVMe协议提供了一个标准的命令Device self-test来主动触发盘的部件检测,可以快速的发现盘是哪个部件出现了问题,可以相应的做出反应,保障用户数据的安全

             • Bits 3:3,为1,表示主控支持NS Management and Attachment。主要用于创建、管理namespace等操作。具体内容可以查看协议8.20章节。

             • Bits 2:2,为1,表示主控支持Firmware Commit and Firmware Image Download。Firmware Commit,在协议1.0和1.1被称为"Firmware Activate",用来修改固件镜像或者Boot Partitions(协议1.3新加入,这其实是eMMC上的功能,启动分区其实是为智能手机和平板电脑等使用这些使用嵌入式NVMe BGA SSD系统所准备的)。Firmware Image Download命令用于将所有或部分映像下载到主控,以便将来更新。具体内容可以查看协议5.11和5.12章节。

             • Bits 1:1,为1,表示主控支持Format NVM。Format NVM命令用于低级别格式化NVMe SSD。host主机使用此命令更改LBA和或元数据大小。低级格式可能会销毁与所有namespace相关联的所有数据和元数据,或仅销毁与命令相关联的特定namespace。详细内容,可以查看协议5.23章节。

             • Bits 1:1,为1,表示主控支持Security Send and Receive。Security Receive命令用于传输先前提交给主控的一个或多个Security Send命令的状态和数据。Security Send and Receive命令之间的关联取决于安全协议。要传输的数据的格式取决于安全协议。有关安全协议的详细信息,请参阅SPC-4(scsi primary command 4)。

acl: Abort Command Limit. 此字段表示主控支持的并发执行Abort命令的最大数量,该主控支持的数量为7,协议推荐至少为4。Abort命令用于中止先前提交到Admin Submission Queue或I/O Submission Queue的特定命令。Abort命令是一个尽力而为的命令;要中止的命令可能已经完成、当前正在执行、或者可能已深度排队。具体内容可以查看协议5.1章节。

aerl: Asynchronous Event Request Limit. 此字段表示主控支持的并发未完成的Asynchronous Event Request命令的最大数量。该主控支持的数量是3,协议建议至少支持4。Asynchronous Event Request由Host发送,用于让SSD上报Asynchronous Event (异步事件)。Host可以发送多个Asynchronous Event Request命令,用于降低SSD上报时的Latency。异步事件,协议里定义了Error Event、SMART/Health Event、Notice Events、NVM Command Set Specific events、Vendor Specific event等内容。具体内容可以查看协议5.2章节。

frmw: Firmware Updates. 该字段表示关于固件更新的能力。

             • Bits 7:5,为保留字段,该主控启用了Bit5,增加了NVMe2.0协议的内容。

             • Bits 5:5,为0,表示主控不支持Multiple FW or Boot Update Detection。这部分内容是在NVMe2.0协议3.11和8.22章节。

             • Bits 4:4,为1,表示主控支持Firmware不需要resetSSD才能生效。

             • Bits 3:1,为3,表示该主控支持3个固件槽。固件槽(firmware slot) 是用于存储firmware固件镜像的位置。

             • Bits 0:0,为1,表示该主控的固件槽1为只读。

lpa: Log Page Attributes .该字段表示通过"Get Log Page"命令访问到的log page中的可选属性。协议1.4中Bit7:5是保留字段,NVMe2.0协议里启用了Bit5、6字段。

             • Bits 6:6为0 ,代表主控不支持Telemetry Host-Initiated和Controller-Initiated log页中的Telemetry Log Data Area 4。NVMe协议1.4中,每个Telemetry数据日志被划分为三个Telemetry数据区(即Area 1、Area 2和Area 3,后者均包含前者)。
             Data Area 1:第一阶段,确定存在问题,通过收集最小的数据集来确定问题与其他问题的区别。
             Data Area 2:第二阶段,收集并分析更深入的中等量有效数据集,以确定问题的来源。
             Data Area 3:第三阶段,可用于收集最大和最完整的数据集,以诊断问题。
具体内容,查看协议8.14章节。

             • Bits 5:5为0 ,表示主控不支持在Commands Supported and Effects日志页中返回每个命令的作用范围;可能支持Supported Log Pages日志页(Log Identifier 05h);可能支持Feature Identifiers Supported and Effects日志页(Log Identifier 12h);可能支持NVMe-MI Commands Supported and Effects日志页(Log Identifier 13h)。

             • Bits 4:4 ,表示主控不支持Persistent Event log。持久化事件日志功能,NVMe 1.4新增功能之一,相当于SSD的"黑匣子"。遇到错误告警、固件升级、格式化等导致SSD状态信息发生改变的Event时,会进行清晰易读的日志记录,且当设备掉电、重启、Reset、Format、Sanitize操作时,都不会被消除,持久化保留。

             • Bits 3:3,为1,表示主控支持 Telemetry Host-Initiated、Telemetry Controller-Initiated日志页、支持发送Telemetry Log Notices。Telemetry功能定义了收集SSD厂商自定义日志的机制,Telemetry数据采集可以是Host-Initiated和Controller-Initiated,前者是Host发起获取SSD一些关键信息,后者是SSD认为重要的数据,由SSD厂商自定义。该部分内容可以查看协议8.14章节。

             • Bits 2:2,为1,表示主控Get Log Page命令中支持Extended data,包含extended Number of Dwords[32 位而不是 12 位)]、Log Page Offset字段。如果不支持Extend data,则 Number of Dwords Lower 字段的位 27:16 指定要传输的 Dwords 数。该部分可以查看协议5.14章节

             • Bits 1:1,为1,表示主控支持Command Effects Log Page。表示主控允许描述供应商特定命令和规范定义命令的效果。具体内容可以查看协议5.14.1.5章节

             • Bits 0:0,为0,表示主控不支持SMART/Health Log Page per Namespace。

elpe: Error Log Page Entries. 该字段表示主控存储的最大错误信息日志条目数是63。

npss: Number of Power States Support. 此字段表示支持的NVMe电源状态数为1。这是基于0的值。详细内容可以查看协议第8.4节。电源状态从0开始按顺序编号。主控应支持至少一个电源状态(即电源状态0),最多可以支持到编号31的电源状态(总共32个)

avscc: Admin Vendor Specific Command Configuration.

             • Bits 7:1, 保留字段

             • Bits 0:0,为1,表示该主控的Admin Vendor Specific命令使用了协议Figure 107的定义格式。如果是0,表示该命令是供应商自定义格式。

avscc: Autonomous Power State Transitions。为0,表示不支持自动电源状态切换。详细内容,可以查看协议8.4.2章节。

wctemp: Warning Composite Temperature Threshold。综合温度告警阈值,代表主控处于持续运行的温度告警状态,此时需要进行额外的散热或者减少负载。存储平台应努力保持温度低于该值。该主控数值为353开尔文 = 80摄氏度。

cctemp: Critical Composite Temperature Threshold。紧急综合温度告警阈值,表示主控处于过热情况(可能阻止继续正常操作,数据有丢失的可能性,设备自动关闭,极端的性能下降,或永久性损坏)。该主控数值为356开尔文 = 83摄氏度。

mtfa: Maximum Time for Firmware Activation. 表示主控临时停止处理命令以激活固件FW的最长时间。如果主控支持主控激活而reset重置,则该字段应有效。此字段以100毫秒为单位指定。值0h表示最大时间未定义。

hmpre: Host Memory Buffer Preferred Size。为0,表示主控不支持HMB特性,具体可以查看协议8.9章节。HMB提供机制,让Host主机可以将目前不须要用到的内存资源,通过NVMe协议提供给SSD使用。适用于无外置缓存固态硬盘,可以借用Host主机内存来实现FTL映射表存取,加速来提高性能。HMPRE该字段指示host主机被请求以4 KiB为单位为HMB分配容量的期望大小。协议要求hmpre大于等于hmmin。

hmmin: Host Memory Buffer Minimum Size。该字段表示要求主机为主机内存缓冲区功能分配的最小数量,以4KiB为单位。如果该字段为0,表示Host主机被要求分配任何可能的主机内存容量,直至HMPRE值。

tnvmcap: Total NVM Capacity。此字段表示NVM子系统中的总NVM容量。该值以B为单位。如果主控支持NameSpace管理功能(协议第8.12节),该字段需要做支持。该主控显示为为1920383410176,表示为1920383410176B。

unvmcap: 这个字段表示NVM子系统中未分配的NVM容量。如果主控支持NameSpace管理功能(协议第8.12节),该字段需要做支持。

rpmbs: Replay Protected Memory Block Support。为0,表示主控不支持RPMBS特性。 RPMB最初在嵌入式存储eMMC,UFS中引入。在写入数据到 RPMB 时,会校验数据的合法性,只有指定的 Host 才能够写入,同时在读数据时,也提供了签名机制,保证 Host 读取到的数据是 RPMB 内部数据,而不是攻击者伪造的数据。RPMB 在实际应用中,通常用于存储一些有防止非法篡改需求的数据,例如手机上指纹支付相关的公钥、序列号等。具体可以查看协议8.10章节。

edstt: Extended Device Self-test Time。为35,表示主控在电源状态0下完成extend device self-test操作所需的时间是35分钟。关于Device Sef-test部分,可以查看协议8.11章节

dsto: Device Self-test Options. 为1,表示NVM subsystem一次只支持一个正在进行的Device Self-test操作。

fwug: Firmware Update Granularity。此字段表示FW Download命令更新的FW固件的粒度和对齐要求(具体内容,可以查看协议第5.12节)。如果FW Download命令中NUMD字段或OFST字段中指定的值不符合此粒度和对齐需求,则固件更新可能会失败,状态为无效命令字段。为了与主机软件实现最广泛的互操作性,协议建议主控将此值设置为尽可能低的值。该值以4个KiB单位报告(例如,1h对应于4个KiB,2h对应于8个KiB)。值0h表示没有提供关于粒度的信息。FFh的值表示没有限制(即,允许数据字中的任何粒度和对齐)。

kas: Keep Alive Support。Keep Alive用于确保NVMe设备与主机之间的连接保持活动状态,并防止在空闲时关闭连接。此字段以100毫秒为单位指示Keep Alive Timer的粒度(具体内容,可以查阅协议第7.12节)。如果此字段被清除为0h,则不支持Keep Alive功能。Keep Alive功能是NVMe over Fabrics必选项。

hctma: Host Controlled Thermal Management Attributes 。为0,表示主控不支持Host Controlled Thermal Management。Host Controlled Thermal Management允许host主机指定两个温度阈值(TMT1/TMT2),SSD应在此温度下执行轻度和严重的节流以降低SSD的温度。具体内容,可以查看协议8.4.5章节。

mntmt: Minimum Thermal Management Temperature。该字段表示当 NVMe 设备达到该温度阈值时,主控将开始执行针对温度的管理策略,单位为开氏度。值0h表示主控未报告此字段,或者不支持Host Controlled Thermal Management(具体内容个,可以查看协议第8.4.5节)

mxtmt: Maximum Thermal Management Temperature。该字段表示主控在执行热管理策略时允许的最高温度阈值略,单位为开氏度。值0h表示主控未报告此字段,或者不支持Host Controlled Thermal Management(具体内容个,可以查看协议第8.4.5节)

:一般来说,Minimum Thermal Management Temperature(MNTMT,一般为70℃)≤TMT1<TMT2≤Maximum Thermal Management Temperature(MXTMT,一般为77℃)。

sanicap: Sanitize Capabilities。这部分内容,详细可查看协议8.15章节。

             • Bits 31:30,为0,表示没有定义No-Deallocate Modifies Media After Sanitize (NODMMAS)。NODMMAS是一种可选的数据擦除模式,它不会释放已分配的nand介质,而是直接覆盖和标记为无效状态。这样可以避免需要进行注销释放操作所造成的延迟和资源开销,并且可以更快速地完成数据擦除操作。当设置为01b时,表示在Sanitize操作成功完成后,NVMe主控不对nand介质进行额外的修改。设置为10b时,表示在Sanitize操作成功完成后,NVMe主控会进行额外修改NAND介质。在额外NAND介质修改完成之前,不会发出Sanitize Operation Completed事件。

             • Bits 29:29,No-Deallocate Inhibited (NDI)。为0,指示主控不支持sanitize命令中的No-Deallocate After Sanitize位。

如果sanitize命令包括No-Deallocate After Sanitize设置为“1”并且 NODMMAS 设置为 10b,则sanitize操作具有关联的额外nand介质修改操作。这个额外的nand介质修改操作是对sanitize命令的结果起作用,目的是使所有 LBA 内容都可读。

             • Bits 28:03,保留字段
             • Bits 02:02,为0,表示不支持Overwrite Support (OWS)。用特定的数据格式覆盖用户数据。Overwrite擦除方式最早在HDD上应用,HDD的数据是存储在带有磁性涂层的金属盘片上,写入新数据可以通过覆写的方式完成。协议演进到NVMe1.3引入Sanitize功能,Overwrite擦除方式也得以沿用。然而,SSD的存储介质与HDD不同,读取和写入的基本单位不是HDD的比特(bit)或字节(byte),而是一个页(Page),新的数据写入需要先擦除(Erase),然后再写入(Program),擦除必须按照块(Block)为单位进行,这无形中会引入额外擦除,从而降低SSD寿命;

             • Bits 01:01,为1,表示支持Block Erase Support (BES)。Block Erase是从block级别,也就是从物理上彻底擦除SSD上的数据;

             • Bits 00:00,为1,表示支持Crypto Erase Support (CES)。Crypto Erase是对于支持自加密功能的SSD,通过删除密钥,使加密数据不可识别。

hmminds: Host Memory Buffer Minimum Descriptor Entry Size。为0,表示主控不会对host主机内存缓冲区描述符条目的大小有任何限制。表示HMB 允许host主机将其物理内存空间划分为 NVMe 设备使用的缓冲区,以提高数据传输性能和效率。HMB 的具体实现方式包括分配一部分主机内存作为 HMB,然后将 HMB 分成若干个固定大小的描述符条目,用于向 NVMe 设备发送和接收数据。 Host Memory Buffer Minimum Descriptor Entry Size 是指这些描述符条目的最小size。

hmmaxd: Host Memory Maximum Descriptors Entries是指host主机内存缓冲区中可用的最大描述符条目数量.。为0,表示主控没有表明主机内存缓冲区描述符条目的最大数量。

nsetidmax: NVM Set Identifier Maximum。Namespace Identifier (NSID),它可以用来标识和选择特定的namespace,例如用于分配和访问存储空间。NSETIDMAX 是命NSID数量的上限。

endgidmax: Endurance Group Identifier Maximum。Endurance Group允许将存储介质划分为多个区域,并对每个区域进行独立的写入和擦除操作。这可以帮助改善 SSD 的性能、可靠性和寿命等方面的问题。endgidmax 是Endurance Group标识符数量的上限值。

andtt: ANA Transition Time,表示 ANA 状态之间转换的最大时间(秒)。如果主控支持Asymmetric Namespace Access Reporting ,该字段应设置为非零值。如果主控不支持Asymmetric Namespace Access Reporting ,那么该字段应被清除为 0h。具体内容可以查看协议第8.21.4节。

anacap: Asymmetric Namespace Access Capabilities;非对称命名空间访问能力,该字段表示与非对称名称空间访问报告相关的功能。

             • Bits 7为0 ,主控不支持Namespace Management命令中ANAGRPID字段的非零值。同样,如果不支持名称空间管理命令,则应将该位清零为 "0"。ANAGRPID 字段被用于指定 Asymmetric Namespace Access Group Identifier。ANAGRPID 是一个 16 位字段,它允许将命名空间关联到某个特定的 ANA 组。

             • Bits 6, 设置为 "1",则当Namespace连接到任何主控时,Identify Namespace数据结构中的 ANAGRPID 字段不会更改。如果清零为 "0",则当Namespce连接到任何主控时,ANAGRPID 字段可能会更改。 附加到任何主控时,ANAGRPID 字段可能会更改。感兴趣可以阅读第 8.20.2 节。

             • Bits 5,保留字段

             • Bits 4,为0,表示主控不支持报告 ANA Change state。ANA Change State 的作用是提供一种机制,使得host能够感知到存储设备的路径状态的变化,从而做出相应的调整,优化数据传输过程。

             • Bits 3,为0,表示主控不支持报告ANA Persistent Loss state。ANA Persistent Loss state表示特定Namespace访问路径的已不可恢复。host收到当收到 ANA Persistent Loss 状态通知时,应停止尝试通过这个路径访问数据,转向其他可用的路径。

             • Bits 2,为0,表示主控不支持报告 ANA Inaccessible state。ANA inaccessible state 表示特定的Namespace当前不可访问。

             • Bits 1,为0,表示主控不支持报告ANA Non-Optimized state。ANA Non-Optimized state 表示特定Namespace访问路径当前是可用的,但并不是最优的。

             • Bits 0,为0,表示主控不支持报告ANA Optimized state。当存在多个可以访问同一个Namespace路径时,某些路径可能比其他路径提供更好的性能或更低的延迟。这些性能较好的路径被标记为 Optimized,而其它路径则被标记为 Non-Optimized。

anagrpmax: ANA Group Identifier Maximum。该字段表示 NVM 子系统中任何主控的有效 ANA Group Identifier标识符的最大值。如果主控支持 Asymmetric Namespace Access Reporting(请参阅 CMIC 字段),则该字段应设置为非零值。如果主控不支持 则该字段应清除为 0h。

nanagrpid: Number of ANA Group Identifiers。此字段表示主控支持的 ANA 组数。如果主控支持非对称名称空间访问报告(请参阅 CMIC 字段),则该字段应设置为小于或等于 ANAGRPMAX 值的非零值。如果主控不支持Asymmetric Namespace Access Reporting,则应将该字段为 0h。

pels: Persistent Event Log Size。该字段表示持久事件日志(第5.14.1.13 节)的最大可报告大小,单位为 64KiB。如果不支持持久事件日志,则保留此字段。

domainid: Domain Identifier:表示包含该主控的domain的标识符【NVMe 2.0协议新增】。NVM 子系统不支持多domain【即 NVM子系统由单个domain组成)】,则此字段为0h。

MEGCAP: Max Endurance Group Capacity,表示单个Endurance Group的最大容量【NVMe 2.0协议新增】。该字段为 0h,则 NVM子系统不报告最大耐久组容量值。

sqes: Submission Queue Entry Size 定义使用 NVM 命令集时所需的和最大提交队列条目大小。在 NVMe 中,每一个提交队列包含了一系列的队列条目(Queue Entries),每个队列条目都包含了命令本身以及与该命令相关的元数据。
             • Bit 7:4 定义使用 NVM 命令集时的最大提交队列条目大小。此值大于或等于所需的SQ条目大小(即Bit 3:0)。该值以字节为单位,定义为2(2^n)的幂。建议值为 6,对应于64字节【标准NVM命令集SQ条目大小】。实现专有扩展的主控可能支持更大的值。
             • Bit 3:0 定义使用 NVM 命令集时所需的(即最小)提交队列条目大小。这是可以使用的最小条目大小。该值以字节为单位,定义为 2(2^n)的幂。例如n值为6,则对应64字节。

cqes: Completion Queue Entry Size,定义使用 NVM 命令集时所需的和最大完成队列条目大小。

             • Bit 7:4 定义使用 NVM 命令集时的最大完成队列条目大小。此值大于或等于所需的CQ条目大小(即Bit 3:0)。该值以字节为单位,定义为2(2^n)的幂。建议值为4,对应于16字节【标准NVM命令集CQ条目大小】。实现专有扩展的主控可能支持更大的值。
             • Bit 3:0 定义使用 NVM 命令集时所需的(即最小)完成队列条目大小。这是可以使用的最小条目大小。该值以字节为单位,定义为 2(2^n)的幂。值为4,则对应16字节。

nn: Number of Namespaces,该字段表示 NVM 子系统有效 NSID 的最大值。

oncs: Optional NVM Command Support,此字段表示主控支持的可选 NVM 命令和功能。

             • Bits 15:8 NVMe1.4协议里是保留字段,NVMe2.0协议里启用了bit 8;

             • Bits 8 表示主控不支持NVM Command Set中的Copy命令。Host只需要把Copy Command发给SSD Controller,后续事情便不再需要Host参与,全部交由SSD执行,省去DMA过程。目前Copy命令不能跨Namespace或跨硬盘使用。

             • Bits 7 为0,表示主控不支持Verify命令。Verify命令通过读取指定 LBA 的数据和元数据(如有)来验证存储信息的完整性,而不向host传输任何数据或元数据。

             • Bits 6 为1,表示host可设置主控时间戳的特性。

             • Bits 5 为0,表示不支持预留功能。

             • Bits 4 为1,表示主控支持在Set Features命令中将Save字段设置为非零值,并且支持在Get Features命令中将 Select 字段设置为非零值。简而言之支持保存设置和获取指定的特性。

             • Bits 3 为1,表示主控支持Write Zeroes命令。Write Zeroes用来对一段连续的LBA写0h数据的一个命令,通过将这些LBA释放出来,供上层应用使用。它可以通过具体的参数配置,来决定是否要真的往物理地址写0h数据,还是仅仅在被读取时返回数据全0h的内容

             • Bits 2 为1 ,表示主控支持Dataset Management命令。Dataset Management命令管理SSD上的数据集,包括分配和释放(deallocate)逻辑块。其中,Deallocate属性是Dataset Management命令的一部分。

nbsp;            • Bits 1 为1,表示主控支持 Write Uncorrectable命令。Write Uncorrectable 命令允许OS向主控发出一个指示,要求将特定的逻辑块地址(LBAs)标记为不可校正错误(Uncorrectable Error),主要用于测试和错误注入场景。

nbsp;            • Bits 0 为1,表示主控支持Compare命令。Compare 命令用于比较存储在一个或多个连续的逻辑块地址(LBAs)上的数据与通过该命令提供的数据缓冲区中的数据是否匹配。该命令从host向NVMe设备发送一串数据,然后主控会检查这些数据与其存储的相应LBA区域的数据是否一致。

fuses: Fused Operation Support为0 ,此字段表示主控不支持Fused Compare and Write。Fused Compare and Write 命令是一个原子操作,结合了 Compare 和 Write 两个单独的操作。首先Compare命令中指定的逻辑块内容与存储在指定 LBA 范围内的数据进行比较。如果比较成功,则立即在相同的位置执行Write操作。如果比较操作不成功,则写入操作将中止。整个过程是原子的,这样可以防止中间状态的发生。

fna: Format NVM Attributes,该字段是Format NVM命令的属性。

             • NVMe1.4协议中,Bits 7:3是保留字段,NVMe2.0协议中启用了Bit3

             • Bits 3 为0,表示 Format NVM 命令支持设置NSID值为FFFFFFFFh【十进制是4294967295】,表示格式化主控上的所有命名空间。

             • Bits 2 为1,表示主控Fortmat NVM支持Crypto Erase属性。

             • Bits 1 为0,表示主控在Format NVM时,支持指定在Namespace进行安全擦除操作。若为1,表示主控在Format NVM时,会将整个NVM子系统中的所有Namespace上的数据都安全擦除操作。

             • Bits 0 为0,表示主控Format NVM(不包括Crypto Erase操作)操作只会生效在到指定的Namespace。

vwc: Volatile Write Cache,该字段表示主控中关于易失性写缓存有关的属性。

该字段表示 I/O 命令集厂商特定命令处理的配置设置为0x3【11b】,表示主控的flush命令支持将NSID设置为FFFFFFFFh。Flush 命令(协议第6.8节)用于将易失写缓存中的内容写入到非易失缓存区域。 NSID 设置为 FFFFFFFFh 时,Flush 命令应用于整个 NVM 子系统的所有Namespace,用于确保在可能的断电或系统崩溃等情况下,所有待处理的写入操作都已经被正确地完成,从而防止数据丢失。

             • Bits 0为0,表示该主控禁用易失性写缓存。

awun: Atomic Write Unit Normal,为1023,表示在执行原子写入操作时,可以保证数据完整性的最大数据块大小是1023字节。原子性写入指的是写入操作要么完全发生,要么完全不发生,不存在部分完成的情况。

awupf: Atomic Write Unit Power Fail。表示该字段表示在断电或出错的意外情况下,可保证原子性写入操作的最小数据单位个数。该字段从0开始计数,为7,表示最多8个连续的块(如果每个块是512字节,那么总共是4096字节)可以被保证作为一个原子性操作成功写入。如果提交的写入命令大小<=AWUPF值,则可以保证host对 NVM 的写入原子性。如果提交的写入命令 > 此大小,则无法保证命令的原子性。如果写入大小<=AWUPF 值,且写入命令失败,则相关逻辑块的后续读取命令将返回上一条成功写入命令的数据。如果提交的写入命令大小> AWUPF 值,则不能保证在随后读取相关逻辑块时返回数据.

icsvscc:I/O Command Set Vendor Specific Command Configuration,该字段表示 I/O 命令集厂商特定命令处理的配置设置。
             • Bits 7:1是保留字段。

             • Bits 0为1,表示NVM Vendor Specific Commands使用协议中定义的标准格式。

nwpc: Namespace Write Protection Capabilities,该字段表示主控支持的可选Namespace写保护功能。

             • Bits 7:3是保留字段。

             • Bits 2为0,表示主控不支持Permanent Write Protect。

             • Bits 1为0,表示主控不支持Write Protect Until Power Supply。

             • Bits 0为0,表示主控不支持No Write Protect and Write Protect Namespace。

image

状态 定义 跨Power Cycles的持久性 跨Controller Level Resets的持久性
No Write Protect NameSpace无写保护 Yes Yes
Write Protect NameSpace具有写保护 Yes Yes
Write Protect Until Power Cycles 下次PowerCycle前具备写保护 No Yes
Permanent Write Protect 持久化写保护 Yes Yes

acwu: Atomic Compare & Write Unit (ACWU)。
此字段表示Compare&Write融合操作写可保证写入NVM的大小。如果特定的NameSpace的可保证写入大小大于该数值,将会在NACWU字段中报告。若是不支持Atomic Compare&Write操作,则该字段为0h

ocfs: Optional Copy Formats Supported。这个字段确实比较迷惑,协议中也没有翻到该字段。找了多家SSD厂商规格书,该字段指向为Copy Descriptor Formats Supported【CDFS】,NVMe2.0中加入该字段。
image
参考链接https://nvmexpress.org/wp-content/uploads/NVM-Express-Subsystem-Local-Memory-Specification-1.0-2023.12.20.pdf

sgls: SGL Support,为0,表示不支持SGL方式来描述一段数据空间。SGL由若干个SGL segment组成,每个segment又由若干个SGL descriptor组成。与PRP描述物理页不同,SGL可以描述任意大小的内存空间,更为灵活。
             • Bits 31:22 保留字段
             • Bits 21 若为1,表示支持Transport SGL Data Block描述符
             • Bits 20 若为1,表示支持支持在SGL Data Block, SGL Segment, and SGL Last Segment中设定一个offet偏离值
             • Bits 19 若为1,表示支持使用包含一个SGL Segment地址的元数据指针(MPTR),该SGL Segment包含一个四字节对齐的SGL描述符。
             • Bits 18 若为1,表示主控支持包含数据或元数据SGL的命令长度可以大于实际需要传输的数据量。
             • Bits 17 当CDW0.PSDT字段设置为01b时,元数据缓冲区的对齐要求。若为1,表示支持使用字节对齐的连续物理地址来存储元数据
image
             • Bits 16 若为1,表示支持SGL Bit Bucket描述符
             • Bits 15:03 保留字段
             • Bits 02 若为1,表示支持使用Keyed SGL Data Block描述符。
             • Bits 01:00 该字段决定主控SGL支持的NVM命令集的支持情况

定义
00b 不支持SGLs
01b 支持SGLs。Data Blocks没有 dword四字节对齐和粒度要求
10b 支持SGLs。Data Blocks有 dword四字节 对齐和粒度要求
11b 保留字段

mnan: Maximum Number of Allowed Namespaces。该字段表示 NVM 子系统支持的命名空间最大数量。 若该字段为 0h,则 NVM 子系统支持的命名空间最大数量小于或等于 NN 字段中的值。 如果主控支持非对称命名空间访问报告Asymmetric Namespace Access Reporting,则该字段应设置为小于或等于 NN 值的非零值。
maxdna: Maximum Domain Namespace Attachments。NVMe2.0协议中加入该字段。表示Domian中I/O Controller中NameSpace数量总和的最大值。如果将该字段清零为0h,则不指定最大值。 Domain在NVMe2.0协议中有比较详细的描述。NVM子系统可由单个Domain或多个Domain(即两个或多个)组成。 Domain是共享状态(如电源状态、容量信息)的最小不可分割单元。
image

maxcna: Maximum I/O Controller Namespace Attachments。NVMe2.0协议中加入该字段。表示允许连接到I/O controller的命名空间的最大数量。 如果将该字段清零为 0h,则不指定最大值。 该字段值应小于或等于 NVM 子系统支持的命名空间数(即MNAN字段)。
image

subnqn: NVM Subsystem NVMe Qualified Name。标识 NVMe 命名空间和子系统的唯一字符串,采用UTF-8 null-terminated字符串格式。NVMe1.2.1协议以及之后的版本必须支持该字段。
ioccsz: I/O Queue Command Capsule Supported Size。NVMe2.0协议中加入该字段。主控支持的 I/O 队列命令包(Command Capsule)的最大大小。以16bytes为单位,若字段数值为4,则表示最大是64bytes
iorcsz:I/O Queue Response Capsule Supported Size。NVMe2.0协议中加入该字段。主控支持的 I/O 队列响应包(Command Capsule)的最大大小。以16bytes为单位,若字段数值为1,则表示最大是16bytes
icdoff: In Capsule Data Offset。NVMe2.0协议中加入该字段。与命令包(Command Capsule)相关的参数,用于指定命令包中数据部分的偏移量。以 16 bytes为单位。这个字段仅适用于 I/O 队列中的命令包,Admin队列中的命令包应使用值 0。
fcatt: Fabrics Controller Attributes。NVMe2.0协议中加入该字段。此字段表示主控针对 NVMe over Fabrics 的属性。
image

msdbd: Maximum SGL Data Block Descriptors (MSDBD)。NVMe2.0协议中加入该字段。表示host主机在命令包(capsule)中可以放置的SGL数据块描述符或带标记的SGL数据块描述符的最大数量。

ofcs: Optional Fabrics Commands Support。NVMe2.0协议中加入该字段。表示主控支持可选的Fabrics命令。
             • Bits 15:1 保留字段
             • Bits 0,为0,表示不支持Disconnect命令

ps: power state。描述每个功率状态属性的功率状态描述符。NVMe1.4协议描述的功耗结构如下
             • Bits 255:184 保留字段
             • Bits 183:182 Active Power Scale (APS) 功率刻度。

定义
00b 未报告功率状态
01b 0.0001W
10b 0.01W
11b 保留字段

             • Bits 178:176 Active Power Workload (APW):此字段表示用于计算此功率状态最大功率的工作负载。 除非 ACTP 为 0h,否则该字段不得为 "无工作负载"。
             • Bits 175:160 Active Power (ACTP):该字段表示 NVM Subsystem在此功率状态下 10 秒钟内消耗的最大平均功率,其工作负载在 "Active Power Workload "字段中标出。 功率(W)等于此字段中的值乘以 "Active Power Workload"字段中指示的标度。 值为 0h 表示不报告主动功率。
             • Bits 159:152 保留字段
             • Bits 151:150 Idle Power Scale (IPS):该字段表示空闲功率字段的刻度。

定义
00b 未报告功率状态
01b 0.0001W
10b 0.01W
11b 保留字段

             • Bits 149:144 保留字段
             • Bits 143:128 Idle Power (IDLP):表示在空闲状态下(即没有待处理的命令、寄存器访问、后台进程、清理操作或设备自检操作),NVM子系统在30秒内消耗的典型功率。测量从NVM子系统空闲10秒后开始。功率(W)等于该字段中的值乘以IPS字段中指示的比例。值为0h表示未报告空闲功率。Host主机可以使用此值来管理功率与恢复延迟之间的关系。
             • Bits 127:125 保留字段
             • Bits 124:120 Relative Write Latency (RWL)。表示与此电源状态相关的相对写入延迟。该字段中的值应小于支持的电源状态数量(例如,如果主控支持16种电源状态,则有效值为0到15)。较低的值意味着较低的写入延迟。
             • Bits 119:117 保留字段
             • Bits 116:112 Relative Write Throughput (RWT)。此字段表示与此电源状态相关联的相对写入吞吐量。该字段中的值应小于支持的电源状态数量(例如,如果主控支持16种电源状态,则有效值为0到15)。较低的值表示更高的写入吞吐量。
             • Bits 111:109 保留字段
             • Bits 108:104 表示与此电源状态相关的相对读延迟。该字段中的值应小于支持的电源状态数量(例如,如果主控支持16种电源状态,则有效值为0到15)。较低的值意味着较低的读延迟。
             • Bits 103:101 保留字段
             • Bits 100:96 Relative Read Throughput (RRT)。此字段表示与此电源状态相关联的相对读取吞吐量。该字段中的值应小于支持的电源状态数量(例如,如果主控支持16种电源状态,则有效值为0到15)。较低的值表示更高的读取吞吐量。
             • Bits 95:94 表示退出此电源状态所关联的最大退出延迟,单位为微秒。值为0h表示未报告退出延迟。
             • Bits 63:32 表示进入此电源状态所关联的最大进入延迟,单位为微秒。值为0h表示未报告进入延迟。
             • Bits 31:26 保留字段
             • Bits 25 Non-Operational State (NOPS) 表示主控是否在此电源状态下处理I/O命令。如果此位被清除为‘0’,则控制器在此电源状态下处理I/O命令。如果此位被设置为‘1’,则控制器在此电源状态下不处理I/O命令。
             • Bits 24 Max Power Scale (MXPS)。此位指示最大功耗字段的刻度。如果此位被清除为‘0’,则最大功耗字段的刻度为0.01瓦特。如果此位被设置为‘1’,则最大功耗字段的刻度为0.0001瓦特。
             • Bits 23:16 保留字段
             • Bits 15:00 Maximum Power (MP):此字段表示NVM子系统在此电源状态下持续消耗的最大功耗。瓦特数等于此字段中的值乘以MXPS。值为0h表示未报告最大功耗。
             • Bits 25
             • Bits 25
             • Bits 25

posted on 2024-11-06 20:20  miyan  阅读(535)  评论(0编辑  收藏  举报