Linux内核模块的性能剖析

12

我有兴趣对Linux内核的一个模块进行性能分析。我尝试了以下步骤:

  1. 使用 CONFIG_PROFILING=y 编译内核
  2. 使用 profile=2 启动内核
  3. 通过 echo 123 > /proc/profile 重置性能分析器
  4. 专门的守护程序成功加载了模块
  5. 运行一个用户空间应用程序,通过特定的 ioctl 调用使用该模块。测试应用程序按预期工作,因此模块工作正常。
  6. 使用 readprofile -p /proc/profile -m System.map 读取性能分析信息,其中System.app与内核一起生成。

目前为止,几乎一切都按预期工作。然而,没有得到任何有关我的模块的信息,即没有提到来自该模块的任何函数。

然而,经过重新思考,我想起我忘记使用CONFIG_PROFILING=y重新编译该模块。

所以,我的问题是:如果没有使用CONFIG_PROFILING=y编译,模块是否不会显示在性能分析日志中?还是有其他更明显的原因我不知道?

如果有人想知道为什么我要问而不是直接尝试,那是因为我不能在家里做这件事,我宁愿先听听有经验的人说什么,在再次访问代码之前。


1
我不知道。我认为你对问题的猜测是正确的,因为获得性能分析信息的常见方法是编译器对代码进行插装。但是,我想知道,oprofile 对你的目的是否无法使用?- http://oprofile.sourceforge.net/about/ - Omnifarious
谢谢!Oprofile的安装似乎相当繁琐,而且我不确定它是否支持ARM CPU。 - Albus Dumbledore
1
我已经很久没有在*nix内核上做任何事情了,但是在像GDB这样的调试器下运行您的模块肯定是可行的。然后,您可以使用此基本技术。 (https://dev59.com/n3RC5IYBdhLWcg3wOOL1#378024) - Mike Dunlavey
你能把源代码放在这里吗?谢谢。 - 0x90
2个回答

6

模块以动态方式加载,因此不可能以这种方式对其进行分析,这意味着它们在System.map文件中缺失

解决方法是将驱动程序内置到内核中。不幸的是,这并不总是有效的,因为系统可能被设计成仅使用构建为模块的驱动程序运行。


0

我建议使用oprofile应该可以解决问题。


4
很遗憾,我需要在ARM上使用它。 - Albus Dumbledore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接