Skip to main content

NVM Express(NVMe)

NVM ExpressNVMe),或称非易失性内存主机控制器接口规范英语:Non-Volatile Memory Host Controller Interface Specification,缩写:NVMHCIS),是一个逻辑设备接口规范。它是与AHCI类似的、基于设备逻辑接口的总线传输协议规范(相当于通讯协议中的应用层),用于访问通过PCI Express(PCIe)总线附加的非易失性存储器介质(例如采用闪存固态硬盘驱动器),虽然理论上不一定要求 PCIe 总线协议。
NVM代表非易失性存储器(non-volatile memory)的首字母缩略字,这是固态硬盘(SSD)的常见的闪存形式。此规范主要是为基于闪存的存储设备提供一个低延时、内部并发化的原生界面规范,也为现代CPU、电脑平台及相关应用提供原生存储并发化的支持[1],令主机硬件和软件可以充分利用固态存储设备的并行化存储能力。相比此前机械硬盘驱动器(HDD)时代的AHCI,NVMe/NVMHCI降低了I/O操作等待时间、提升同一时间内的操作数、更大容量的操作队列等。
依托于PCIe总线,NVMe设备可适用于各种支持PCIe总线的物理插槽上,包括标准尺寸的PCIe扩展卡英语Expansion card(一般是4个PCIe通道)[2]、采用U.2物理连接界面(SFF-8639)的2.5英寸/3.5英寸标准尺寸固态硬盘驱动器、[3][4]SATA Express总线(兼容于PCIe)的设备、M.2规格扩展卡等。[5][6]
此规范由“Non-Volatile Memory Host Controller Interface Working Group”(非易失性存储器主机控制器界面工作组)负责管理。

背景

历史上,大多数SSD使用如SATASAS光纤通道等接口与计算机接口的总线连接。随着固态硬盘在大众市场上的流行,SATA已成为个人电脑中连接SSD的最典型方式;但是,SATA的设计主要是作为机械硬盘驱动器(HDD)的接口,并随着时间的推移越来越难满足速度日益提高的SSD。[7]随着在大众市场的流行,许多固态硬盘的数据速率提升已经放缓。不同于机械硬盘,部分SSD已受到SATA最大吞吐量的限制。
在NVMe出现之前,高端SSD只得以采用PCI Express总线制造,但需使用非标准规范的接口。若使用标准化的SSD接口,操作系统只需要一个驱动程序就能使用匹配规范的所有SSD。这也意味着每个SSD制造商不必用额外的资源来设计特定接口的驱动程序。[8]
截至2014年9月,在光纤通道(FC)上使用NVMe的新标准也正在开发。[9]

历史

2009年Intel开始着手寻找SATA的替代方案。SATA作为串行接口,采用AHCI规范,其已经成为制约SSD速度的瓶颈。AHCI只有1个命令队列,队列深度32.而NVMe可以有65535个命令队列,每个队列都可以深达65536个命令。NVMe也充分使用了MSI的2048个中断向量优势,延迟大大减小。
2011年有了1.0。最新的版本是1.2.1;最大带宽为11.6Gbps,约为1200MB/s。

操作系统支持

Linux内核的存储控制堆栈中,NVMe的数据路径、不同层面下多重内部队列的位置[10]
9Front
2017年3月30日,NVMe驱动程序发布并供使用[11]
Chrome OS
2015年2月24日,加入NVMe驱动至内核和引导加载程序,可从NVMe设备启动Chrome OS[12][13]
DragonFly BSD
DragonFly 4.6开始内置NVMe驱动程序[14]
FreeBSD
Intel赞助开发的驱动程序已内置于FreeBSD的head、stable/9分支中。[15][16]nvd(4)和nvme(4)驱动程序则是在10.2版FreeBSD中开始默认内置于其中。[17]
Haiku
Haiku已有驱动开发时程,但是目前仍未完成[18]
illumos
illumos于2014年10月15日获得驱动程序支持[19]
iOS
iOS 9开始支持,首款配备了NVMe接口的设备是iPhone 6S/6S Plus,也是首款采用NVMe的移动设备。物理接口和UFS相同的采用M-PHY PCIe。接下来Apple推出的iPad ProiPhone SE也采用了NVMe[20]
Linux
NVMe的驱动程序最早是英特尔提供的,适用于Linux的内核驱动程序模块。[21][22][23]这个模块在2012年3月19日集成到Linux内核的主线驱动程序当中,Linux内核3.3版开始内置支持而无需安装额外模块。[24]
2014年1月19日的Linux内核 3.13版开始,加入由Fusion-io开发的blk-multiqueue或称blk-mq模块,是为“可变区块层”(scalable block layer),用于NVMe SSD。This leverages the performance offered by SSDs and NVM Express, by allowing much higher I/O submission rates. With this new design of the Linux kernel block layer, internal queues are split into two levels (per-CPU and hardware-submission queues), thus removing bottlenecks and allowing much higher levels of I/O parallelization.[25][26][27]
2015年4月12日发布的Linux内核 4.0版开始,VirtIO区块层驱动程序,SCSI驱动层(与SATA驱动共用)、回环设备驱动(loop device) UBI(unsorted block images)驱动(供闪存实现区块擦写管理)以及RBD驱动程序(which exports Ceph RADOS objects as block devices)都被修改,以适应及适配越来越多的NVMe设备[28][29][30]
NetBSD
NetBSD在2016年的开发版本中初步支持NVMe。[31]OpenBSD则是在其6.0版时发布了NVMe的驱动程序。
OpenBSD
OpenBSD的NVMe驱动程序自2014年6月开始,由此前开发并发布USBAHCI驱动程序的高级开发团队负责。[32]OpenBSD 6.0开始正式支持。[33]
OS X/macOS
Mac OS X 10.10.3(OS X Yosemite)开始支持NVMe。苹果公司的Retina MacBook和2016年发布MacBook Pro,配备了使用NVMe的PCIe SSD作为主硬盘驱动器使用。[34]
Solaris
Solaris自Oracle Solaris 11.2开始支持NVMe。[35]
VMware
英特尔发布了供VMWare使用的NVMe驱动程序,[36]vSphere 6.0以及其后的版本中,均包含了该驱动程序,支持多种NVMe设备。[37]在 vSphere 6 update 1 更新中,VMWare的VSAN软件模拟的存储子系统也开始支持NVMe设备。[38]
Windows
微软在Windows 8.1Windows Server 2012 R2开始,原生支持NVMe设备。[39][40]同时也为Windows 7Windows Server 2008 R2提供原生驱动程序支持(需由用户自行下载获取)[41]
除了微软官方提供的驱动程序以外,OpenFabrics Alliance也有维护一套开放源代码的NVMe驱动程序,使用于Windows 7、8、8.1、10以及Windows Server 2008 R2、2012、2012 R2,这套驱动程序由数个加入了NVMe工作组的公司开发,包括IDT、英特尔以及LSI[42] The current release is 1.5 from December 2016.[43]

Comments

Popular posts from this blog

CKA Simulator Kubernetes 1.22

  https://killer.sh Pre Setup Once you've gained access to your terminal it might be wise to spend ~1 minute to setup your environment. You could set these: alias k = kubectl                         # will already be pre-configured export do = "--dry-run=client -o yaml"     # k get pod x $do export now = "--force --grace-period 0"   # k delete pod x $now Vim To make vim use 2 spaces for a tab edit ~/.vimrc to contain: set tabstop=2 set expandtab set shiftwidth=2 More setup suggestions are in the tips section .     Question 1 | Contexts Task weight: 1%   You have access to multiple clusters from your main terminal through kubectl contexts. Write all those context names into /opt/course/1/contexts . Next write a command to display the current context into /opt/course/1/context_default_kubectl.sh , the command should use kubectl . Finally write a second command doing the same thing into ...

OWASP Top 10 Threats and Mitigations Exam - Single Select

Last updated 4 Aug 11 Course Title: OWASP Top 10 Threats and Mitigation Exam Questions - Single Select 1) Which of the following consequences is most likely to occur due to an injection attack? Spoofing Cross-site request forgery Denial of service   Correct Insecure direct object references 2) Your application is created using a language that does not support a clear distinction between code and data. Which vulnerability is most likely to occur in your application? Injection   Correct Insecure direct object references Failure to restrict URL access Insufficient transport layer protection 3) Which of the following scenarios is most likely to cause an injection attack? Unvalidated input is embedded in an instruction stream.   Correct Unvalidated input can be distinguished from valid instructions. A Web application does not validate a client’s access to a resource. A Web action performs an operation on behalf of the user without checkin...