分析 Linux 内核模块
Posted
技术标签:
【中文标题】分析 Linux 内核模块【英文标题】:Profiling Linux Kernel Modules 【发布时间】:2011-04-23 08:41:34 【问题描述】:我有兴趣为 Linux 内核分析一个模块。我是这样尝试的:
-
用
CONFIG_PROFILING=y
构建内核
使用profile=2
引导内核
通过echo 123 > /proc/profile
重置分析器
模块已由专用守护程序成功加载
通过特定的ioctl
调用运行正在使用该模块的用户空间应用程序。测试应用按预期运行,因此模块运行正常。
使用readprofile -p /proc/profile -m System.map
读取分析信息,其中System.app 是与内核一起生成的。
到目前为止,一切都很好。几乎一切都按预期工作。然而,没有起作用的是我没有得到关于我的模块的任何信息,即没有提到模块中的任何功能。
然而,再想一想,我记得我忘记使用CONFIG_PROFILING=y
重新编译模块。
所以,我的问题是:模块没有出现在分析日志中是因为它没有使用CONFIG_PROFILING=y
编译,还是有其他一些我不知道的更明显的原因?
如果有人想知道,为什么我要问而不是立即尝试,那是因为,我不能在家里做,我想听听知识渊博的会说什么在我再次访问代码之前。
【问题讨论】:
我不知道。我认为您对问题的猜测是正确的,因为获取分析信息的常用方法是让编译器检测代码。但是,我想知道,oprofile 不适合您的目的吗? - oprofile.sourceforge.net/about 谢谢! Oprofile 的安装似乎相当繁琐,我不确定它是否支持 ARM CPU。 我已经很久没有在 nx 内核中做任何事情了,但是必须可以在像 GDB 这样的调试器下运行你的模块。然后你可以使用this basic technique。 你能把源代码放在这里吗?请 【参考方案1】:似乎不可能以这种方式分析模块,因为它们是动态加载的,这意味着它们在 System.map 文件中丢失。
解决方案是将驱动程序构建到内核中。不幸的是,这并不总是有效,因为系统可能被设计为仅使用内置在模块中的驱动程序来运行。
【讨论】:
【参考方案2】:我建议使用oprofile 应该可以。
【讨论】:
很遗憾,我需要在 ARM 上使用它。以上是关于分析 Linux 内核模块的主要内容,如果未能解决你的问题,请参考以下文章