什么是NVMe? NVMe是Host和SSD之间通信的协议,属于协议栈的上层。

NVMe制定了Host和SSD之间通信的命令,以及命令的执行方法。

NVMe包含两种类型的命令:管理命令,用于在主机上管理和控制固态硬盘。 另一个是I/o命令,用于在主机和固态硬盘之间传输数据。 以下是NVMe1.2支持的命令列表。

NVMe支持的管理命令:

NVMe支持的I/o命令:

与ATA spec中定义的命令相比,NVMe的命令数量少得多,并且完全是为SSD定制的。 大家现在不要纠结于具体的命令,理解就行了。

NVMe包含三种类型的队列命令:提交队列(sq )、完成队列(CQ )和双精度注册(db )。 SQ和CQ位于主机的存储器中,DB位于SSD的控制器内部。 如下图所示。

SQ位于Host存储器中,Host发送命令时,将准备好的命令放入SQ中,然后通知SSD来取; CQ也位于主机内存中,当一个命令执行完成且成功或失败时,SSD总是向CQ写入命令完成状态。 DB在Host发送命令时,没有直接向SSD发送命令,而是将命令准备好放在自己的存储器中。 Host通过写入SSD侧的DB寄存器来通知已经处理了SSD命令,并能够来进行检查。 流程如下图所示。

将Host命令写入SQ;

主机写DB,通知SSD拿手指

SSD接到通知,从SQ上取手指

SSD执行指令

命令执行完毕,SSD向CQ写入命令执行结果;

然后SSD用邮件通知Host命令已完成;

接收邮件,主机处理CQ,查看命令完成状态;

Host处理完毕CQ中的指令执行结果已在DB中处理了SSD )指令执行结果。