Aks*_*ngh 7 drivers debugging kernel-modules control-flow
我正在研究 Linux 设备驱动程序,我的主要重点是 wifi 驱动程序。我想知道当我插入我的设备时代码是如何流动的。也许,我可以做一些事情,比如printk在每个函数中添加一行。我拥有的设备由ath9k_htc驱动程序支持。出于学习目的,我想对驱动程序代码进行一些更改。
理解 linux 中驱动程序模块的代码流的正确或通用方法是什么?
Ste*_*itt 15
当我想要做到这一点,我使用的ftrace框架。首先挂载特殊文件系统:
mount -t tracefs nodev /sys/kernel/tracing
Run Code Online (Sandbox Code Playgroud)
(作为 root;您应该成为所有这些的 root,无论如何您都将以 root 身份做所有事情,并且拥有 root shell 比使用更容易sudo)。
然后切换到该目录:
cd /sys/kernel/tracing
Run Code Online (Sandbox Code Playgroud)
它包含一个README提供简短摘要的基本信息。为了探索函数调用,我使用了函数图跟踪器,function_graph在available_tracers. 确定您感兴趣的功能,例如ath9k_htc_tx,并设置它们
echo ath9k_htc_tx > set_graph_function
Run Code Online (Sandbox Code Playgroud)
您可以附加其他功能,请确保>>在第一个功能之后使用。你可以看到配置的功能
cat set_graph_function
Run Code Online (Sandbox Code Playgroud)
当您写入 时set_graph_function,会根据正在运行的内核检查该函数;如果找不到该函数,则写入将失败,因此您将立即知道是否最终不跟踪任何内容。
设置功能后,启用跟踪器:
echo function_graph > current_tracer
Run Code Online (Sandbox Code Playgroud)
然后看trace文件。要再次禁用跟踪器,
echo nop > current_tracer
Run Code Online (Sandbox Code Playgroud)
或tracing_on通过向其写入 0 或 1 来翻转(0 表示禁用跟踪,1 表示重新启用)。