一文读懂NVMe的基本原理

图3 环形缓冲区

NVMe通过一种门铃机制(Doorbell)来告知控制器命令队列是否有新数请求/命令。也就是说每个队列都有一个门铃指针。对于发送队列来说,这个指针表示的是发送队列的尾指针。主机端将数据写入到发送队列后,更新映射到位于设备寄存器空间中的门铃的尾指针。此时,在控制器端就知道有新的请求/命令到来,接下来就可以进行对其进行处理。

当控制器完成一个NVMe请求时,通过完成队列来把完成的结果告知主机端。与发送队列不同,完成队列是通过中断机制(可以是INTx,MSI或MSIx)告诉主机端。如图4是一个命令的完整处理流程。

一文读懂NVMe的基本原理

图4 命令处理完整流程

NVMe的命令格式

前面我们介绍了命令的发送和处理流程,接下来我们看看NVMe的命令长什么样。如图5是NMVe命令的具体格式,如果大家了解TCP/IP协议或者SCSI协议,那么理解本图将相当容易。在图4中每一行为8个字节,命令大小总共为64字节。

一文读懂NVMe的基本原理

图5 NVMe的命令格式

在这个命令格式中有几个字段本身是比较复杂的,限于篇幅,且不打算让大家看完本文后头疼,本文不打算介绍所有细节。本文简单的介绍一下该命令格式的几个关键字段。其中Command Identifier标识一个具体的命令。Namespace Identifier则表示命令发送到那个命名空间。Data Pointer 1 和Data Pointer 2则用于标识数据的具体位置。

这里有两点需要说明:

NVMe的一个控制器下面可以有多个命名空间(Namespace),通过Namespace ID来标识的。

命令与数据是分离的,并不像TCP那样数据在命令后面。

我们这里重点介绍一下Command Identifier,该字段占用4个字节的空间。虽然仅有4个字节,但有分为3大部分,6小部分,具体如图6所示。

图6 命令标识格式

我们以从低位到高位的顺序分别介绍一下各个字段的含义:

OPC: 全称为Opcode,也就是被执行命令的操作码。具体来说就是想让控制器干什么,比如读数据、写数据或者刷写等。

  • UC3846控制芯片工作原理控制图 逆变焊机原理与用途
  • 数字万用表电阻档测试二极管正反向没有阻值(使用万用表测量二极管的正向电阻,为什么各档)
  • 学单片机需要学数电模电吗(学单片机要先学数电模电吗)
  • 电工怎么选择适合自己用的万用表(电工初学者买什么样的万用表好)
  • 单片机需要同时运行多个任务怎么办(单片机怎么同时执行多个任务)
  • 电机保护的方案取决于负载的机械特性
  • 绝缘电阻表正负搭接不复零位是怎么回事
  • 短路怎么用万用表查