ubuntu下linux内核源码阅读工具和调试方法总结
一 linux内核源码阅读工具
windows下当然首选source insight, 但是linux下就没有source insight这么优秀的工具了,但是也有不少的替代品,但觉绝对部分人会选择vim+ctags+cscope的组合,还有部分人或选择wine中的source insight或选择navigatror,当然对于代码阅读来说vim+ctags+cscope的组合还是比较好的一个选择方案,但是,当我使用了eclipse之后,个人感觉用eclipse作为linux环境下源码阅读工具确实比vim+ctags+cscope的组合方便很多。
下面是linux环境下eclipse的配置安装方案:
eclipse下载地址:http://eclipse.org/downloads/?osType=linux
eclipse环境配置方案:http://forum.ubuntu.org.cn/viewtopic.php?t=183803
二 eclipse + qemu 进行linux源码的编译和调试
最初调试内核采用了qemu + insight 或qemu + ddd的组合,相比来说insgiht的界面更加有好些,但是ubuntu 10.04以上的版本,删除了对Insight的默认支持,只能下载insight的源码编译安装,而且insight更新非常慢。 很久以前就看到有人用eclipse + qemu进行linux内核源码的编译和调试,这次终于抽了个时间尝试一下,毕竟eclipse的debugger是非常强大的。
工具组合: Eclipse IDE for C/C++ Linux Developers + qemu-0.12.3 (最好用kvm, 不幸的是机器太旧,不支持硬件虚拟化)
1.首先我们要从www.kernel.org下载内核源码,在这里我选择的是 linux-2.6.32.tar.bz2。我将其下载到我的主目录下,然后在terminal下输入以下命令。
$ cd (回到主目录)
$ tar xf linux-2.6.32.tar.bz2 (解压源码)
$ mkdir linux-2.6.32-obj (创建一个编译内核的目标文件输出目录)
$ cd linux-2.6.32 (进入内核源码树根目录)
$ make O=~/linux-2.6.28-obj menuconfig (这里我们要配置内核,并在~/linux-2.6.32-obj目录下生成内核配置文件.config)
$ make mrproper
2. 接下来我们打开elicpse,第一次打开时有一个欢迎画面,
我们单击右边的workbench图片关掉欢迎画面。由于eclipse cdt是一个非常强大的c/c++ ide,它默认会自动的解析工程中源程序并编译工程和产生智能提示信息。但由于我们调试内核过程中暂不会用到这些功能,所以要关闭他们。
首先我们到Window->Preferences->General->Workspace 中将Build Automatically选项去掉。
然后到Window->Preferences->C/C++ -> Indexer中,将默认的Fast c/c++ indexer改为No indexer。
然后我们开始创建一个新的工程。
从菜单中选择File -> New -> Project... -> C/C++ -> C Project 然后单击Next按钮。
这时出现一个对话框,在Project Name 一栏填入一个工程名,比如 linux-kernel. 然后将 Use default location 选项给勾掉。在Location一栏填入刚才解压的内核源码的路径。Project type选择Makefile project -> Empty project。Toolchains 选择 Linux GCC.最终结果如下图所示:

然后单击Next按钮,出现下一个对话框。这时候因为工程的默认配置还不完全符合我们的要求。所以我们单击 Advanced Settings 按钮会打开一个工程配置对话框。我们选择左侧的 C/C++ Build 选项,在相应的右侧页面里我们将Builder Settings 选项页下的 Use default build command 勾选掉,然后指定一个新的Build command 为 make O=/home/xxx/linux-2.6.28-obj.然后单击Build location中的File system...按钮更改obj文件的输出目录为/home/xxx/linux-2.6.28-obj. 最终结果如下图所示:

然后单击Behaviour选项页,将build(Incremental Build)中的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 -append root=/dev/hda
我解释一下这个命令行上的参数。
-s 选项表示我们运行虚拟机时将1234端口开启成调试端口,供eclipse网络调试时使用
-S 选项表示我们启动虚拟机时要“冻住”虚拟机,等待调试器发出继续运行的命令。
-hda ~/linux-0.2.img 表示我们要运行时的硬盘 (这个文件可以在http://wiki.qemu.org/Download下到)
-kernel /home/xxx/linux-2.6.32-obj/arch/x86/boot/bzImage 表示我们要调试的内核镜像
-append root=/dev/hda 表示我们要传递给内核的参数(这里你可能感觉有点奇怪为啥是/dev/hda而不是/dev/hda1或是/dev/hda2呢?因为这个镜像仅仅是一个分区的二进制镜像,不是整个硬盘的镜像)
启动后,你会看到屏幕黑黑的啥也没有。因为我们指定了-S参数把虚拟机给“冻”住了。
继续回到eclipse中,这时候我们在菜单中选择Run -> Debug Configurations ,这时候打开一个配置页面。然后我们在C/C++ Application上双击鼠标,这时在右侧的页面弹出了debug配置选项,然后我们在project一栏选择 linux-kernel ,在下面的C/C++ Application中填入/home/xxx/linux-2.6.32-obj/vmlinux,如下图所示:

然后我们单击Debugger选项页,将Debugger改为 GdbServer Debugger . 将Stop on startup at 改为start_kernel,将Connection子选项页下的Type改为TCP将Port number改为1234,最终如下图所示:

然后单击Debug按钮开始调试!这时候Eclipse会提示我们切换 Perspective ,选择是,不再提示。
这时候就开始调试内核,而且是源码级的调试!如下图:

总结:不知道是我机器烂还是咋地,eclipse+qemu虽然调试信息更加详细,eclipse的调试器也足够强大,但是每次调试前都要进行编译,时间太久了,等不起!! 哪位大侠可知道如何每次调试不要编译!!
ubuntu下linux内核源码阅读工具和调试方法总结的更多相关文章
- ubuntu下载linux内核源码
ubuntu仓库里面关于源码部分配置的好全啊,什么都有,ps:包括vim的各种插件居然也有人打包放到仓库里,真是方便. 1.首先查看一下本系统使用的内核版本号: cat /proc/version L ...
- Linux内核源码阅读记录一之分析存储在不同段中的函数调用过程
在写驱动的过程中,对于入口函数与出口函数我们会用一句话来修饰他们:module_init与module_exit,那会什么经过修饰后,内核就能狗调用我们编写的入口函数与出口函数呢?下面就来分析内核调用 ...
- linux内核源码阅读之facebook硬盘加速利器flashcache
从来没有写过源码阅读,这种感觉越来越强烈,虽然劣于文笔,但还是下定决心认真写一回. 源代码下载请参见上一篇flashcache之我见 http://blog.csdn.net/liumangxiong ...
- Ubuntu下获取内核源码
查看当前系统使用的内核版本: apt-cache search linux-source 输出如下: linux-source - Linux kernel source with Ubuntu pa ...
- linux内核源码阅读之facebook硬盘加速flashcache之八
前面我们的分析中重点关注正常的数据流程,这一小节关注如果有异常,那么流程是怎么走完的呢? 1)创建新任务时kcached_job申请不到 2)读写命中时cache块为忙 3)系统关机时处理,系统开机时 ...
- linux内核源码阅读之facebook硬盘加速flashcache之三
上一节讲到在刷缓存的时候会调用new_kcahed_job创建kcached_job,由此我们也可以看到cache数据块与磁盘数据的对应关系.上一篇:http://blog.csdn.net/lium ...
- linux内核源码阅读之facebook硬盘加速flashcache之四
这一小节介绍一下flashcache读写入口和读写的基础实现. 首先,不管是模块还是程序,必须先找到入口,用户态代码会经常去先看main函数,内核看module_init,同样看IO流时候也要找到入口 ...
- linux内核源码阅读之facebook硬盘加速flashcache之二
flashcache数据结构都在flashcache.h文件中,但在看数据结构之前,需要先过一遍flashcache是什么,要完成哪些功能?如果是自己设计这样一个系统的话,大概要怎么设计. 前面讲过, ...
- linux内核源码阅读之facebook硬盘加速flashcache之六
其实到目前为止,如果对读流程已经能轻松地看懂了,那么写流程不需要太多脑细胞.我觉得再写下去没有太大的必要了,后面想想为了保持flashcache完整性,还是写出来吧.接着到写流程: 1530stati ...
随机推荐
- GRUB引导——menu.lst的写法
转自menu.lst的写法.menu.lst的写法 1.menu.lst的写法之一 首先我们看一下我的Fedora 4.0 中的/boot/grub/menu.lst 的内容: default=0 ...
- CF_225B _Well-known Numbers
Numbers k-bonacci (k is integer, k > 1) are a generalization of Fibonacci numbers and are determi ...
- [wikioi]最优布线问题
http://wikioi.com/problem/1231/ Kruskal+并查集.comp函数里面如果用const引用的话,可以减少copy.并查集find的时候是递归找父亲的根.无他. #in ...
- 视频硬解api介绍
在一个gpu如此强大的时代,视频解码怎么能少了gpu厂商的参加.为了用硬件加速视频解码,厂商定义了一些api. 好吧,一旦和硬件打交道,就会有os的参加,有了硬件与os参加,api肯定会变成很凌乱,看 ...
- 火车车次查询-余票查询--Api接口
1.来自12306的火车车次数据 使用12306网站的接口,查询余票.此接口采集自 这里. 全国火车站代号字典,下载 . 火车票余票查询 http://dynamic.12306.cn/otsquer ...
- C#程序集使用强名字(Strong Name)签名/强名称签名
强名称签名的方法: 强签名: 1. 可以将强签名的dll注册到GAC,不同的应用程序可以共享同一dll. 2. 强签名的库,或者应用程序只能引用强签名的dll,不能引用未强签名的dll,但是未强签名的 ...
- bzoj1597
首先不难想到排序,这种无规律的东西一般都要转化为有规律才好做 首先以x为第一关键字,y为第二关键字升序排序 拍完序我们发现,若存在两块土地i,j x[i]<=x[j],y[i]<=y[j] ...
- C#利用NPOI生成具有精确列宽行高的Excel文件
前言 NPOI是操作Excel的神器,导出导入快如闪电, 但是SetColumnWidth函数个人感觉不会用,怎么弄都无法控制好,因为他是以字符数量去设置宽度,实际上Excel列宽还有个像素的概念,更 ...
- BZOJ2287: 【POJ Challenge】消失之物
2287: [POJ Challenge]消失之物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 254 Solved: 140[Submit][S ...
- [C# 网络编程系列]专题十:实现简单的邮件收发器
转自:http://www.cnblogs.com/zhili/archive/2012/09/24/2689892.html 引言: 在我们的平常工作中,邮件的发送和接收应该是我们经常要使用到的功能 ...