NVMe学习笔记之一

Nvme,全称为非易失性内存主机控制器接口规范(Non-Volatile Memory express),是一个逻辑设备接口规范,进一步说明就是一种HOST与SSD之间的通讯协议。虽然NVME的命令可以交给其他接口协议(比如AHCI或SATA协议)完成,但是与PCIE合作才是最强的。

众所周知,SATA接口的SSD,数据传输速度撑死不会超过600MB/s,归根结底还是因为目前的SATA最高带宽就是600MB/s。

我们可以简单计算一下:

现在的使用的主流便是SATA6.0 Gb/s;

1Byte = 8 bit;

6.0 Gb/s理论应该等于 768MB/s,但是据实测最高为600MB/s

如下为使用AS SSD Benchamrk测试西部数据120G SATA SSD的分数。NVMe学习笔记之一_第1张图片

既然SATA SSD遭遇性能瓶颈,那就有必要出现一个新规范来释放SSD性能。于是,NVMe应运而生。现在主流主板都是用PCIE 3.0规范,同理,我们先来算算与PCIE合作的数据传输速度。

PCI-E3.0 协议支持 8.0 GT/s, 即每一条Lane 上支持每秒钟内传输 8G个Bit。

而PCIe 3.0 的物理层协议中使用的是 128b/130b 的编码方案。 即每传输128个Bit,需要发送130个Bit。

那么, PCIe 3.0协议的每一条Lane支持 8 * 128 / 130 = 7.877 Gbps = 984.6 MB/s 的速率。

一个PCIe 3.0 x16的通道,x16 的可用带宽为 7.877 * 16 = 126.031 Gbps = 15.754 GB/s。

差距自然而然就体现出来了,那么既然要了解NVMe,我们不妨先从NVMe的命令入手。

NVME的命令种类。

NMVE有两种命令,,都属于Host与SSD之间通讯的命令,一种叫做Admin Command,用来Host管理和控制SSD;另一种叫做I/O Command,用来Host和SSD之间进行数据传输。如下是NVMe1.3支持的命令列表:

Admin Command:(在NVMe1.3的Figure 41/42)

NVMe学习笔记之一_第2张图片

NVMe学习笔记之一_第3张图片

I/O Command:(在NVMe1.3的Figure 185)NVMe学习笔记之一_第4张图片

至于具体的命令实现,在Spec中也都有比较详细的说明,目前只需知道有这些命令即可,用的时候再去查找。

现在命令有了,那命令该如何执行呢?

NVMe处理命令,主要靠三大部分:Submission Queue(SQ)、Completion Queue(CQ)和Doorbell Register(DB)。SQ和CQ都位于Host的内存中,DB则位于SSD的控制器内部。接着看图来分析NVMe是如何处理命令的:

NVMe学习笔记之一_第5张图片

从图中不难发现,NVMe的命令处理流程八步就完成了,简单解释一下:

  1. Host写命令到SQ(任务队列)
  2. Host写入DB,通知SSD有新命令到达,可以来取命令了
  3. SSD控制器接收到命令,并从SQ中取出命令
  4. SSD控制器执行命令
  5. SSD把命令执行完毕,并往CQ(完成队列)中写执行结果
  6. SSD控制器产生中断信息,告知Host指令完成
  7. Host接到信息,开始处理CQ,查看指令完成状态
  8. Host处理完CQ中的指令执行结果,然后通过DB回复SSD,指令执行结果已处理,该条指令处理完毕

这些基本就是NVMe的简单介绍了,如果你对NVMe有了一个基本认知,目的就达到了。后续会对NVMe的具体介绍以及Shell下命令的执行,分享个人的理解。

你可能感兴趣的:(BIOS,NVME)