这种方法都是平常我自已在阅读的时侯总结的,想到哪就说到哪了,当然我总结的方法远不止这种,并且先说这种吧。前面想到了再补充,只有在领到代码做剖析的时侯遇见实际的问题时,才会见招招术linux内核源代码情景分析 26,想些办法。
虽然linux内核源码还是比较难跟踪的,我刚开始阅读内核源码的时侯,觉得好多东西常常找着找着就丧失头绪了,很沮丧。
通过一些阅读后发觉内核也就这么几招用的比较多,摸透楚其性子后,剩下的就是耐心了。
1.我以前用过一阵VI,装了一堆插件后折腾了一阵,发觉还是未能体会其推崇者所说的那一堆用处,还是喜欢用sourceinsight。好了,说题外话了。首先我们要解决的就是函数或则变量找不到定义地方的问题,表现在sourceinsight上就是那种变量是黑的,四处找不到。
例如我们看们看见:
intbus_register(structbus_type*bus)
...
subsys_set_kset(bus,bus_subsys);
retval=subsystem_register(&bus->subsys);
...
其中的bus_subsys。
找了一下bus_subsys找不到定义的地方,肯定是内核和我们躲猫咪,这时侯我们可以是否查找一些显著的“定义痕迹”,例如在bus_subsys中的subsys或则说_subsys。果然有新发觉。我们找到了如此一个宏。
#definedecl_subsys(_name,_type,_uevent_ops)
structsubsystem_name##_subsys={
.kset={
.kobj={.name=__stringify(_name)},
.ktype=_type,
.uevent_ops=_uevent_ops,
}
得,我们回过头在包含有bus_register的源文件及头文件中查找一下,果然找到了staticdecl_subsys(bus,&ktype_bus,NULL);如此一行代码。
像这些东西我不是很建议一找不到就直接去网上找,关于内核的文章网上其实好多,但都不会细到所有的细节都有,你总有独立处理问题的时侯,为何我们不提早让自已多锻练一下呢?
2.次序问题,内核有好多的次序,例如初始化的次序,例如我们有module_init,__initcall等等,一来编译的时侯文件夹和文件有次序,另外不同的宏包含的东西次序也是有讲求的,所以在剖析模块的时侯一定要注意这个,这个东西只能说是注意了,若果对一个模块不熟悉的时侯,不可能做到全部都了解,像我有时侯也会落下一些东西忘掉剖析,然而随着看内核的时侯越久linux apache 虚拟主机,内核这些惯用的手法见多了后,就发觉不外如是,也就那三瓜籽两枣。
3.我们要解决内核运行时那一堆指来指去的表针的问题。这个是我自已调试用的土方式,我就用dump_stack在关键的地方复印出次序就行了。由于我们做的是嵌入式设备,好多时侯不能用KGDB这种中级工具在线调,但是这些方式基本不降低其它的性能花销。
4.有多个定义不晓得用那个。这个基本是由于LINUX支持的CPU比较多导致的。
我们可以用GDB静态剖析,也可以用objdump和nm等工具来精确定位一些函数和变量,也可以按照宏来一步一步剖析,例如是mips的这么我们就进mips看,这样一步一步来。
5.具备一些意识,你如今面对的是操作系统,不仅仅是只有C文件和头文件的应用,MAKEFILElinux内核源代码情景分析 26,链接文件,Kconfig都应当是你的同事。尤其在看一个模块或则一小部份你感兴趣的代码的时侯,首先可以用MAKEFILE和KCONFIG来缩小你须要关注的范围。虽然关于MAKEFILE和KCONFIG的重要性,fudan_abc在他那种LINUX这些事之我是USB中指出的比较多,而且说实话linux模拟,fudan_abc那文章看了玩是很好玩的,可惜觉得似乎看了没啥用,就是晓得了一堆概念,不能串上去,我不晓得是我的理解能力不行,还是任侨伟同志压根没有讲清楚。呵呵。