目前企业SSD市场按照接口协议主要分为SATA SSD,PCIe SSD和NVMe SSD,其中SATA SSD沿用了传统的HDD使用的SATA协议,在企业应用和服务器兼容性上具有优势;而PCIe SSD则一般使用私有协议,目前已经处于比较小众的产品;NVMe SSD则在PCIe接口上使用新的标准协议NVMe,由于NVMe由大厂Intel推出并交由nvmexpress组织推广,现在被全球大部分存储企业采纳,如memblaze,huawei,samsung都推出了相关的产品。
本系列文章主要以Linux内核 3.10的nvme驱动为参考,从源码方面解析nvme协议。
NVMe Command
NVMe Host(Server)和NVMe Controller(SSD)都是通过NVMe Command进行信息交互。NVMe Spec中定义了NVMe Command的格式,可以看到,NVMe Command占用64字节。其中Command的前4个字节规定如下。Command Identifier作为识别这个Command的标志,Opcode通常包含Command类型(如读写,identify等)。
NVMe Command分为Admin Command和IO Command两大类,前者主要是用于配置,后者用于数据传输。Opcode在这两类的基础上进行划分。下图是管理Command的Opcode定义。
剩余的60个字节则根据Command类型定义。如I/O command的定义如下,CDW10到CDW15根据Command的Opcode确定。
这篇文章先讲到这里,NVMe Command是NVMe协议的基础,理解NVMe Command对阅读后续的文章非常有帮助。下一篇文章将继续探讨NVMe驱动的实现细节。
参考文献:
NVM Express 1.1b from nvmexpress.org
张元元是Memblaze SSD事业部应用工程师,研究方向涉及PCIe SSD在VSAN、Docker等环境中的应用及优化。对于服务器虚拟化、NVMe驱动的实现、Linux内核及容器技术有深入的研究。本系列文章为张元元对于NVMe驱动及相关技术的全面解读,更多张元元的文章请关注他的微信公众号:yuan_memblaze