什么是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 )指令执行结果。