没有前戏,直接进入。蛋蛋就是这么个人。

NVMe是一种Host与SSD之间通讯的协议,它在协议栈中隶属高层。

NVMe在协议栈中处于应用层或者命令层,它是指挥官,军师,在三国的话,就是诸葛亮的角色。”运筹帷幄之中,决胜千里之外”。军师设计好计谋,就交由手下五虎大将去执行。NVMe的手下大将就是PCIe,它所制定的任何命令,都交由虎将PCIe去完成。虽然NVMe的命令可能可以由别的接口协议完成,但NVMe与PCIe合作形成的战斗力无疑是最强的。

NVMe是为SSD所生的。NVMe出现之前,SSD绝大多数走的是AHCI和SATA的协议,后者其实是为传统HDD服务的。与HDD相比,SSD具有更低的延时和更高的性能,AHCI已经不能跟上SSD性能发展的步伐了,已经成为制约SSD性能的瓶颈。所有SATA接口的SSD,你去看性能参数,会发现都不会超过600MB/s。如果碰到有人跟你说它的SATA SSD读取性能可以超过600MB/s,直接拨打110报警。不是底层Flash带宽不够,是SATA接口速度限制了,因为SATA现在最高带宽就是600MB/s。OK,既然SATA接口速度太慢,我用PCIe好了,不过上层协议还是AHCI。五虎上将有了,由刘备指挥,让人不禁感叹暴殄天物呀。刘备什么水平,诸葛亮出现之前,居无定所,一会跟着曹操混,一会又跟着吕布混,谁肯收留就跟谁混。惨呀!AHCI和刘备一个德行,只有一个命令队列,最多同时只能发32条命令,HDD时代(群雄逐鹿)还能混混,SSD时代(三足鼎立)就只有被灭的份。刘备需要三顾茅庐,需要诸葛亮的辅佐。同样,SSD需要PCIe,更需要NVMe。

在这样的背景下,Intel等巨头携天子以令诸侯,集大家智慧,制定出了NVMe规范,目的就是释放SSD性能潜力,解SSD倒悬之苦。

上面只列了几个巨头,参与的公司远不止这些。没有上榜的公司不要见怪。

NVMe制定了Host与SSD之间通讯的命令,以及命令如何执行的。

NVMe有两种命令,一种叫Admin Command,用以Host管理和控制SSD;另外一种就是I/O Command,用以Host和SSD之间数据的传输。下面是NVMe1.2支持的命令列表:

NVMe支持的Admin Command:


NVMe支持的I/O Command:

跟ATA spec中定义的命令相比,NVMe的命令个数少了很多,完全是为SSD量身定制的。大家现在别纠结于具体的命令,了解一下就好。老板交代干活的时候,再找spec一个一个看吧。

命令有了,那么,Host又是怎么把这些命令发送给SSD执行呢?

NVMe有三宝:Submission Queue (SQ),Completion Queue(CQ)和Doorbell Register (DB)。SQ和CQ位于Host的内存中,DB则位于SSD的控制器内部。上图:

这张图信息量比较大,除了让我们知道SQ和CQ在Host的memory中以及DB在SSD端外,而且让我们对一个PCIe系统有一个具体的认识。上图中的NVMe Subsystem一般就是SSD。请看这张图几秒钟,然后闭上眼,脑补SSD所处的位置:SSD作为一个PCIe Endpoint通过PCIe连着Root Complex (RC), 然后RC连接着CPU和内存。RC是什么?我们可以认为RC就是CPU的代言人,助理,或者小蜜。作为系统中最高层,CPU说:我很忙的,你SSD有什么事情先跟我小蜜说!尽管如此,SSD的地位还是较过去提升了一级,过去SSD别说直接接触霸道总裁,就是连小蜜的面都见不到,SSD和小蜜之间还隔着一座南桥呢。滚蛋吧,南桥君!

扯远了,刚才要说什么来着。对了,是三宝。SQ位于Host内存中,Host要发送命令时,先把准备好的命令放在SQ中,然后通知SSD来取;CQ也是位于Host内存中,一个命令执行完成,成功或失败,SSD总会往CQ中写入命令完成状态。DB(大宝?)又是干什么用的呢?Host发送命令时,不是直接往SSD中发送命令的,而是把命令准备好放在自己的内存中,那怎么通知SSD来获取命令执行呢?Host就是通过写SSD端的大宝寄存器来告知SSD的:饭已OK了,下来密西吧!

OK,具体的我们来看看NVMe是如何处理命令的,看图说话:

这是NVMe1.2规范中的第207张图。不知道是人家图画得好呢,还是NVMe就是这么简单,抑或是我比较聪明,反正上面的命令处理流程我一看就明白了。好吧,给没我聪明的人再解释一下。

说,把大象放冰箱一共要几步?答:三步。

第一步,打开冰箱门;

第二步,放进大象;

第三步,关上冰箱门。

说,NVMe处理命令需要几步?答:八步:

第一步:Host写命令到SQ;

第二步:Host写DB,通知SSD取指;

第三步:SSD收到通知,于是从SQ中取指;

第四步:SSD执行指令;

第五步:指令执行完成,SSD往CQ中写指令执行结果;

第六步:然后SSD发短信通知Host指令完成;

第七步:收到短信,Host处理CQ,查看指令完成状态;

第八步:Host处理完CQ中的指令执行结果,通过DB回复SSD:指令执行结果已处理,辛苦您了!

曹植七步作诗,NVMe就比曹植差一点,需要八步。

关于NVMe,到现在相信大家有了一些基本认识。关于更多技术细节,今天我不打算讲了。我要吸取之前的教训,比如在一篇文章里就把SSD基本原理介绍了,而不是分别介绍。这样很不讨巧,一口气写完,对自己写文章是压力,对读者读文章也是压力,对网站的浏览量也不好。阿呆的做法值得学习,一个话题,采用连载的方式推出,有朋友也这么向我建议,于是我决定采取类似方式来谈NVMe,毕竟NVMe是个大话题。于是,我把标题从”蛋蛋读NVMe”改成”蛋蛋读NVMe之一”,后面还有之二,之三。。。接下来《蛋蛋读NVMe之二》我会详细解读NVMe的三宝 (SQ,CQ,DB),敬请期待。


查看我们精华技术文章请移步:

Linux阅码场原创精华文章汇总

扫描下方二维码关注"Linux阅码场"

蛋蛋读NVMe之一:为什么刘备需要NVMe相关推荐

  1. 蛋蛋读NVMe之二: 吉祥三宝

    蛋蛋读NVMe之一:为什么刘备需要NVMe 上回书说道,NVMe有三宝:SQ,CQ和DB.接下来我们就详细的看看这吉祥三宝. Host往SQ中写入命令, SSD往CQ中写入命令完成结果.SQ与CQ的关 ...

  2. 房市静心贴:蛋蛋读NVMe之三

    前情提要: 蛋蛋读NVMe之一:为什么刘备需要NVMe 蛋蛋读NVMe之二: 吉祥三宝 有个人一直在思考三个问题:我是谁?我从哪里来?我要去哪里? 你猜这个人最后怎么着? 成了哲学家? 疯了? 疯了的 ...

  3. nvme命令中prp_蛋蛋读NVMe之三

    有个人一直在思考三个问题:我是谁?我从哪里来?我要去哪里? 你猜这个人最后怎么着? 成了哲学家? 疯了? 疯了的哲学家? 我觉得无外乎这三种结果了. 相比人的世界,这三个问题在NVMe的世界就很容易得 ...

  4. 蛋蛋读UFS之二:UFS协议栈

    转自:蛋蛋读UFS之二:UFS协议栈 任何一种接口或者协议,都是由一个完整的协议栈组成的.UFS也不例外. UFS定义了一个完整的协议栈.从上到下,依次为应用层.传输层.数据链路层和物理层.UFS使用 ...

  5. 蛋蛋读UFS之一:UFS简介

    转载:蛋蛋读UFS之一:UFS简介 我们知道,我们电脑由三大件组成:CPU,内存和硬盘.CPU用以计算和控制,内存用以临时存储程序运行时所需的数据(掉电数据丢失),而硬盘用以长久保存数据(掉电数据不丢 ...

  6. nvme固态硬盘开机慢_别让谣言害了你!关于固态硬盘的谣言以及使用误区 NVMe固态硬盘卡慢怎么办 NVMe固态硬盘卡慢解决方法【详解】-宝商在线...

    凭借高速特性,固态硬盘逐步取代机械硬盘已是大势所趋,关于固态硬盘的话题,自然也就多了起来.今天装机之家小编就来告诉大家,关于固态硬盘的谣言以及使用误区,来看看你中招了没 [误区一:想中毒,哪有这么容易 ...

  7. nvme驱动_用户态NVMe运维利器 SPDK NVMe 字符设备

    ------------ 作者简介 刘孝冬 Intel 高级软件工程师 专注于开源存储SPDK及ISA-L软件的开发. ------------ 随着数据中心规模的不断扩大与延展,硬件设备的运行维护已 ...

  8. NVMe系列专题之一:NVMe技术概述

    1. NVMe的诞生 在NVMe横空出世之前,硬盘的世界还是AHCI的天下.那么问题来了,AHCI又是什么? AHCI,英文全名是Serial ATA Advanced Host Controller ...

  9. 蛋蛋读UFS之三:UFS数据包UPIU

    转自:蛋蛋读UFS之三:UFS数据包UPIU UFS中流淌的数据包叫做UPIU(UFS Protocol Information Unit,UFS协议信息单元),它是固定格式的数据结构,用以传输应用层 ...

  10. nvme linux raid,04-第4章-NVMe VROC KeyVROC NVMe RAID

    4NVMe VROC Key&VROC NVMe RAID 本节介绍位于如下设备上的NVMe VROC Key: ·     机架服务器 ·     刀片服务器 ·     计算节点 Inte ...

最新文章

  1. 中国大陆集成电路芯片领域各个细分代表企业
  2. 硬投票分类器(VotingClassifier)构建实战
  3. huge page 能给MySQL 带来性能提升吗?
  4. 李小璐PGONE事件对推荐系统的考验
  5. 转换mp3名称的小程序
  6. [Leetcode][第1392题][JAVA][最快乐前缀][KMP][字符串编码]
  7. python如何装sklearn_python安装sklearn
  8. MindSpore实践:对篮球运动员目标的检测
  9. Dockerfile最佳实践
  10. c++ 标准异常类层次结构_详解Java异常
  11. 【学习笔记】n皇后问题的解决方法+改进代码(回溯递归)
  12. 方案:计算机软件单元测试(GB/T 15532-1995)
  13. NISP二级复习题库
  14. 【计算机科学】【2020.05】基于深度学习的计算蛋白质结构预测
  15. idea 关于自动导包的设置
  16. IP地址和子网划分学习笔记
  17. linux刻录光驱是哪个好,Linux中使用mkisofs或genisoimage刻录光盘
  18. QMI8658 - 姿态传感器学习笔记 - Ⅰ
  19. 计算机组成原理——总线连接方式
  20. Unity——写入和读取Json信息的方法

热门文章

  1. 【环境保护网】-环保设备_环保设备网_环保产品网_中国环境保护网
  2. 亲测jupyter打不开浏览器
  3. PSNR、SSIM、BD-rate和BD-PSNR
  4. php总结与展望_2020 年的 PHP 回顾与展望
  5. 儿童节html模板,六一儿童节作文350字满分模板
  6. Rmarkdown 报错:无法打开链接
  7. Android设置TabLayout下划线宽度,靠谱版本!
  8. 【Cocos2d-x】物理引擎使用入门
  9. 谈小学计算机教学,浅谈小学计算机教学方法
  10. acwing 1904 奶牛慢跑