NVMe是什么:NVMe是一种Host与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量身定制的。大家现在别纠结于具体的命令,了解一下就好。
NVMe有三种队列命令:Submission Queue (SQ),Completion Queue(CQ)和Doorbell Register (DB)。 SQ和CQ位于Host的内存中,DB则位于SSD的控制器内部。如下图所示:
SQ位于Host内存中,Host要发送命令时,先把准备好的命令放在SQ中,然后通知SSD来取;CQ也是位于Host内存中,一个命令执行完成,成功或失败,SSD总会往CQ中写入命令完成状态。DB则是在Host发送命令时,不是直接往SSD中发送命令的,而是把命令准备好放在自己的内存中,Host就是通过写SSD端的DB寄存器来告知SSD命令已经处理完毕,可以前来检阅。流程如下图所示:
①Host写命令到SQ;
②Host写DB,通知SSD取指;
③SSD收到通知,于是从SQ中取指;
④SSD执行指令;
⑤指令执行完成,SSD往CQ中写指令执行结果;
⑥然后SSD发短信通知Host指令完成;
⑦收到短信,Host处理CQ,查看指令完成状态;
⑧Host处理完CQ中的指令执行结果通过DB回复SSD:指令执行结果已处理。