使用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 开始处理的候选命令的数量。
• 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版本标准的主控
• 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章节相关。
• Bits 13:13 为0,表示主控不支持LBA Status Information Notice。这一部分在协议5.21.1.21章节。
• Bits 12:12 为0,表示主控不支持Predictable Latency Event Aggregate Log Change Notices。这一部分在协议8.18章节。
• Bits 11:11 为0,表示主控不支持Asymmetric Namespace Access Change Notices。这一部分与协议8.20章节相关。
• Bits 10:10 保留字段
• Bits 9:9 为1,表示主控支持Firmware Activation Notices event。这一部分与协议8.20章节相关。
• Bits 8:8 为1,表示主控支持Namespace Attribute Notices event and the associated Changed Namespace List log page.
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章节。
• 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/
• 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
同一个NVM Set内部可以包含一个或者多个NS(name space)
• 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中nvmsr、vwci、mec
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状态
• 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 的有效生命周期。
• 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。
状态 | 定义 | 跨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中加入该字段。
参考链接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,表示支持使用字节对齐的连续物理地址来存储元数据
• 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是共享状态(如电源状态、容量信息)的最小不可分割单元。
maxcna: Maximum I/O Controller Namespace Attachments。NVMe2.0协议中加入该字段。表示允许连接到I/O controller的命名空间的最大数量。 如果将该字段清零为 0h,则不指定最大值。 该字段值应小于或等于 NVM 子系统支持的命名空间数(即MNAN字段)。
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 的属性。
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
本文来自博客园,作者:miyan,转载请注明原文链接:https://www.cnblogs.com/xyjk1002-rejuvenation/p/17045759.html