一linux内核源码阅读工具
windows下其实首选sourceinsightlinux 内核代码阅读工具,然而linux下就没有sourceinsight如此优秀的工具了,然而也有不少的代替品,但觉绝对部份人会选择vim+ctags+cscope的组合,还有部份人或选择wine中的sourceinsight或选择navigatror,其实对于代码阅读来说vim+ctags+cscope的组合还是比较好的一个选择方案,然而,当我使用了eclipse以后,个人觉得用eclipse作为linux环境下源码阅读工具确实比vim+ctags+cscope的组合便捷好多。
下边是linux环境下eclipse的配置安装方案:
eclipse下载地址:
eclipse环境配置方案:
二eclipse+qemu进行linux源码的编译和调试
最初调试内核采用了qemu+insight或qemu+ddd的组合,相比来说insgiht的界面愈加有好些,然而ubuntu10.04以上的版本,删掉了对Insight的默认支持,只能下载insight的源码编译安装,但是insight更新特别慢。许久曾经就听到有人用eclipse+qemu进行linux内核源码的编译和调试,此次总算抽了个时间尝试一下,虽然eclipse的debugger是十分强悍的。
工具组合:EclipseIDEforC/C++LinuxDevelopers+qemu-0.12.3(最好用kvm,不幸的是机器太旧deepin linux,不支持硬件虚拟化)
1.首先我们要从下载内核源码,在这儿我选择的是linux-2.6.32.tar.bz2。我将其下载到我的主目录下,之后在terminal下输入以下命令。
$cd(回到主目录)
$tarxflinux-2.6.32.tar.bz2(解压源码)
$mkdirlinux-2.6.32-obj(创建一个编译内核的目标文件输出目录)
$cdlinux-2.6.32(步入内核源码树枝目录)
$makeO=~/linux-2.6.28-objmenuconfig(这儿我们要配置内核,并在~/linux-2.6.32-obj目录下生成内核配置文件.config)
$makemrproper
2.接出来我们打开elicpse,第一次打开时有一个欢迎画面,
我们单击左侧的workbench图片关闭欢迎画面。因为eclipsecdt是一个十分强悍的c/c++ide,它默认会手动的解析工程中源程序并编译工程和形成智能提示信息。但因为我们调试内核过程中暂不会用到这种功能linux手机,所以要关掉她们。
首先我们到Window->Preferences->General->Workspace上将BuildAutomatically选项去除。
之后到Window->Preferences->C/C++->Indexer中,将默认的Fastc/c++indexer改为Noindexer。
之后我们开始创建一个新的工程。
从菜单中选择File->New->Project...->C/C++->CProject之后单击Next按键。
这时出现一个对话框,在ProjectName一栏填入一个工程名,例如linux-kernel.之后将Usedefaultlocation选项给勾掉。在Location一栏填入刚刚解压的内核源码的路径。Projecttype选择Makefileproject->Emptyproject。Toolchains选择LinuxGCC.最终结果如右图所示:
之后单击Next按键,出现下一个对话框。这时侯由于工程的默认配置还不完全符合我们的要求。所以我们单击AdvancedSettings按键会打开一个工程配置对话框。我们选择两侧的C/C++Build选项,在相应的两侧页面里我们将BuilderSettings选项页下的Usedefaultbuildcommand勾选掉,之后指定一个新的Buildcommand为makeO=/home/xxx/linux-2.6.28-obj.之后单击Buildlocation中的Filesystem...按键修改obj文件的输出目录为/home/xxx/linux-2.6.28-obj.最终结果如右图所示:
之后单击Behaviour选项页,将build(IncrementalBuild)中的all修改为一个空格,将下边的clean修改为mrproper(这是默认去除内核obj文件的命令目标)。弄好后如右图所示:
这个时侯你就可以编译内核了。Ctrl+B开始编译内核。
编译完内核。在/home/xxx/linux-2.6.32-obj/arch/x86/boot/下将生成一个bzImage的大内核镜像。
此时我们在xterm下运行qemu虚拟机,命令行如下:
$qemu-s-S-hda~/linux-0.2.img-kernel/home/xxx/linux-2.6.32-obj/arch/x86/boot/bzImage-appendroot=/dev/hda
我解释一下这个命令行上的参数。
-s选项表示我们运行虚拟机时将1234端口开启成调试端口,供eclipse网路调试时使用
-S选项表示我们启动虚拟机时要“冻住”虚拟机,等待调试器发出继续运行的命令。
-hda~/linux-0.2.img表示我们要运行时的硬碟(这个文件可以在下到)
-kernel/home/xxx/linux-2.6.32-obj/arch/x86/boot/bzImage表示我们要调试的内核镜像
-appendroot=/dev/hda表示我们要传递给内核的参数(这儿你可能觉得有点奇怪为什么是/dev/hda而不是/dev/hda1或是/dev/hda2呢?由于这个镜像仅仅是一个分区的二补码镜像,不是整个硬碟的镜像)
启动后,你会看见屏幕黑漆漆的啥也没有。由于我们指定了-S参数把虚拟机给“冻”住了。
继续回到eclipse中,这时侯我们在菜单中选择Run->DebugConfigurations,这时侯打开一个配置页面。之后我们在C/C++Application上双击键盘,这时在右边的页面弹出了debug配置选项,之后我们在project一栏选择linux-kernel,在下边的C/C++Application中填入/home/xxx/linux-2.6.32-obj/vmlinux,(注意:选择下方的SelectOther...改为StandardCreateProcessLauncher),如右图所示:
之后我们单击Debugger选项页linux 内核代码阅读工具,将Debugger改为GdbServerDebugger.将Stoponstartupat改为start_kernel,将Connection子选项页下的Type改为TCP将Portnumber改为1234,最终如右图所示:
之后单击Debug按键开始调试!这时侯Eclipse会提示我们切换Perspective,选择是,不再提示。
这时侯就开始调试内核,但是是源码级的调试!如右图:
总结:不晓得是我机器烂还是咋地,eclipse+qemu其实调试信息愈发详尽,eclipse的调试器也足够强悍,而且每次调试前都要进行编译,时间太久了,等不起!!哪位高手可晓得怎样每次调试不要编译!!