NVMe - Jokacer/Learn GitHub Wiki

NVMe是专用于PCIe固态存储系统的协议标准,PCIe是计算机局部系统总线,不能直接用于传输存储协议,因此需要在其之上添加其他协议层,后来为了极大的发挥其性能,发布量NVMe协议标准,定义量专用于非易失存储子系统的寄存器接口和命令集。

NVMe采用两个队列进行命令交互---命令提交队列和命令完成队列,命令提交队列是一个环形缓冲区,主机软件通过该队列提交控制器执行命令,新命令被提交至队列尾门铃寄存器,当门铃寄存器写的时候,修改队列尾值,通知NVMe设备,控制器从命令提交队列中按序取出命令并提交队列表项,执行时可以按照任一顺序执;命令完成队列也是一个固定大小的环形缓冲区,用于完成命令发布完成状态,可由命令提交队列标志和指令标志的组合进行唯一标志。一条完成指令可以对应多条提交指令

  1. 主机创建一个用于执行的命令,放入主机内存中的合适的命令提交队列中。

  2. 主机更新命令提交队列尾指针门铃寄存器的值,通知控制器有一个新的命令准备好执行了。

  3. 控制器从主机内存中的命令提交队列中将命令取出,供将来执行用。

  4. 控制器执行命令仲裁。控制器可乱序执行命令,命令仲裁机制选择下一条已经取来的命令来执行,然后执行这条指令。

  5. 命令执行完毕后,控制器写一个命令完成队列表项到相应的命令完成队列,作为命令完成队列表项的一部分,控制器指示最近取的提交命令队列表项。

  6. 控制器可选地生成一个中断给主机系统,通知有一个命令完成队列待处理。

  7. 主机处理命令完成队列中的表项,包括各种错误处理。

主机写命令完成队列头门铃寄存器,指示命令完成队列表项已经处理完了,主机可处理多个表项后再写命令完成队列头门铃寄存器。