分析 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 内核模块的主要内容,如果未能解决你的问题,请参考以下文章

《linux内核设计与分析》内核模块编程

20135327--linux内核分析 实践二

Linux驱动之内核加载模块过程分析

Linux驱动模块的Makefile分析

华为云技术分享Linux内核模块依赖图绘制

Linux Kernel模块内存泄露分析