一、nvme命令
1 nvme在pcie基础上的协议,与PCIE配合,实现高效传输。
2 nvme命令主要分IO命令和admin命令。
3 一个NVME CMD执行流程:
step1:host把cmd写入SQ queue中;
step2:host远端更新Device(SSD)内部的doorbell,更新SQ tail;
step3:SSD检测到doorbell内部变化,去host SQ queue去cmd,取回后,更新SQ head指针;
step4:SSD执行取回的CMD;
step5:SSD把执行结果写入CQ;
step6:SSD使用MSI-X中断通知host;
step7:Host从CQ queue读取Cpl;
step8:Host更新远端的doorbell,即CQ head;
Host怎么管理head和tail指针:
首先host可以往DB写:SQ tail和CQ head;但是SQ head 和 CQ tail怎么处理呢
首先是SQ head指针,SSD取指令对于host是不可见的,所以当SSD取完指令后,把head信息更新到了CQ head里面,host拿到CQ信息就知道了SQ的head;
至于CQ的tail指针怎么处理呢,CQ命令里面DW3有个P字符,初始化时候设置成0,当CQ填入时候,把该值设置成1,这样当SSD发送CQ到host时候,host可以读取CQ任何信息,保留了上次P状态位置,即旧的tail位置,依次往下检查,得到现在的新的tail位置。
4 PRP和SGL
4.1 理清楚作用,以及两者区别:PRP是描述物理页大小,SGL可以描述任意内存大小;(主机有无划分物理页)
PRP是地址,可以是物理内存地址,也可以是指向PRP的list,具体看PRP个数,因为CMD里面只有PRP0 PRP1两个
SGL注意类型,SGL描述符还是段描述符。
5 PCIE和NVME架构
NVME属于事务层之上的应用,无论什么cmd,都会被封装成TLP包到物理层,发送到对端。
可以参考《深入浅出SSD》,分析一个cmd命令在host到SSD之间的nvme cmd和TLP包的传输过程。
未完待续...(后序继续补充)