从PCIe trace中分析NVMe

       笔者也是第一次使用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 Trace协议可以从以下几个方面入手: ### 代码分析 - 分析相关代码是学习NVMe Trace协议的重要途径。例如,`nvme_trace_common` 函数定义在 `[trace.c]` 文件中,该函数用于解析并生成通用的命令信息的跟踪事件输出字符串。它从CDW10中提取命令的通用字段,并将这些信息添加到跟踪序列中以生成输出字符串,通过仔细研究这段代码,可以深入了解NVMe Trace协议在代码层面的实现细节[^1]。 ```c // 假设这里有nvme_trace_common函数的示例代码(实际代码需根据具体情况分析) void nvme_trace_common(...) { // 从CDW10提取通用字段 // 添加信息到跟踪序列 // 生成输出字符串 } ``` ### 模块关系理解 - 了解NVMe各模块间的关系有助于从整体上把握NVMe Trace协议。通过查看 `driver/host/nvme/makefile` 文件,可以知道不同模块的编译配置情况。例如,`obj-$(CONFIG_NVME_CORE) += nvme-core.o` 表明当配置了 `NVME_CORE` 时,会编译 `nvme-core.o` 模块。不同模块之间相互协作,共同实现NVMe的各项功能,其中也包括Trace相关功能,理解这些模块关系能更好地定位Trace协议在整个系统中的位置和作用[^2]。 ### 命令包分析 - NVMe命令包是理解Trace协议的关键。NVMe命令包是16Dword,并且将自己的命令隐藏为PCIe Data。可以从Trace中查找DATALength为16Dword的TLP包,通过分析这些包来了解NVMe命令的传输和处理过程,从而深入学习Trace协议如何对这些命令进行跟踪和记录[^3]。 ### 功能操作学习 - 学习NVMe的一些功能操作与Trace协议的关联。例如,在设置队列数的操作中,`SET FEATURES (Feature ID=0x07)` 用于动态调队列数,通过分析相关代码 `struct nvme_command c = {0}; c.features.opcode = nvme_admin_set_features; ...` 可以了解在这个过程中Trace协议可能会跟踪哪些信息,如命令的提交、控制器的返回等。另外,手动创建和删除IO队列的操作,如 `nvme admin-passthru /dev/nvme0 -o 0x05 ...` 等,也可以结合Trace协议分析操作的执行过程和相关信息的记录情况[^4]。 ### 初始化阶段研究 - NVMe初始化阶段涉及到许多与Trace协议相关的操作。在 `nvme init` 阶段,host会进行一系列的写入操作,如写AQA、ASQ、ACQ,写CC ON,CC ready后写MSIX中断向量表等。通过研究这个阶段的操作和配置,可以了解Trace协议在系统初始化时如何跟踪和记录这些重要的配置信息,以及这些信息对后续Trace过程的影响[^5]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值