笔者也是第一次使用PCIe协议分析仪这么高大上的设备,倒腾了不少时间才摸得其中门道,如有差错望指正一二,且先总结如下。
第一次打开PCIe trace,可以看到如图所示:
如果你和我一样觉得摸不着头脑,那么请往下看;上图中时PCIe 的TLP/DLLP包,确实看不出和NVMe有半毛钱的关系。我们知道NVMe 命令包是16Dword,而NVMe又是将自己的命令隐藏为PCIe Data的,所以我们从trace中看能不能找到DATALength为16Dword的TLP包,如下图笔者终于逮到一只这样的TLP包:
打开其中的DATA区为:0100780001000000 00000000 00000000 00000000 00000000 00B0FC37 04000000 0000000000000000 E89A6600 00000000 07000000 00000000 00000000 00000000;由于大小端关系命令可翻译为:00780001 00000001 00000000 00000000 00000000 00000000 0000000000000000 00000004 37FCB000 00000000 00669AE8 00000007 00000000 0000000000000000。
有没有觉得很熟悉,这就是标准的NVMe写命令,解析如下:
Opcode:01,FUSE:0,PSDT:0,CID:0x78,NSID:1,MPTR:0,PRP2:0,PRP1:0x437FCB000,SLBA:0x00669AE8,LR:0,FUA:0,PRINFO:0,NLB:07,DSM:0,ILBRT:0,LBATM:0,LBAT:0。
那么这条NVMe命令的意思就是:从内存地址PRP1(0x437FCB000)写NLB((7+1)* sector = 4K)数据到盘片SLBA(0x00669AE8)地址。
补充下更更直观的图:
本文来自博客园,作者:ingram14,转载请注明原文链接:https://www.cnblogs.com/ingram14/p/15778946.html