要能够深入到linux内核,需要必备的三个工具:一是编译内核;二是使用qemu+gdb调试内核;三是使用syetmtap探测内核。
一、编译linux内核:
Linux开源的一个重要体现就是用户可以根据自己的实际需要配置自己的Linux系统,一般的Linux发行版本为了能够保证在大多数机器上运行,因此会编译进许多对最终用户没有用的代码或模块。作为一名即将进入linux源代码世界的人,怎能容许有这样的“累赘”呢?因此,我们要根据自己“躯体”来定制自己的“灵魂”。后面你会逐步发现,编译内核是学习linux内核源代码的基础。
现将Linux的编译调节过程简述为(默认主机的环境是32bit ubuntu):
1.下载自己要编译的Linux内核的源代码,这个可以从Linux内核的官方网站上得到:www.kerenl.org。
2.编译内核最主要的便是配置文件.config,为了能够准确的得到结果(第一次不要求编译时间),将本机的config文件直接拷贝到解压后的源代码中,然后重命名为.config。
3.然后进行make操作(可以采用make –j 4来加快编译),这样一般不会出问题,但时间较慢,大约编译一次需要40分钟;更加详细的参考步骤请参加《How tocompile linux kernel 2.6》:http://www.cyberciti.biz/tips/compiling-linux-kernel-26.html。
4.为了降低编译时间,就需要对配置文件进行裁剪,在配置文件中有好多是本机不需要的,尤其是device driver,它占据了编译内核的大部分时间,这就要根据自己的机器配置,将用不到的模块删掉。参考:http://lamp.linux.gov.cn/Linux/kernel_options.html。
5.剪裁的时候采用“逐步瘦身”法,先剪裁掉某个或某几个模块,然后在进行编译,若没错,在进行模块裁剪,这样可以最大程度上保证内核配置的正确性,而且由于进行的是增量编译,所以编译时间会比较快。
二、 使用Gdb+qemu调试内核
你想一步一步的跟踪Linux的启动过程吗?你想像dgb调试程序一样来调试Linux内核吗?如果你有这样的想法,恭喜你,你已经会提问题啦!(有问题总是好的,可怕的便是没有问题)。(以下默认的主机环境是ubuntu 32bit的,在64bit的机子上会有很多问题,若要注意解决发现得不偿失,先调通32bit的再说吧)
1.安装qemu
ubuntu下使用sudoapt-get install 安装的qemu可能会存在bug,使得无法在断点处停下;因此需要在qemu官方网站http://wiki.qemu.org/Download上下载最新的版本的源代码包自己进行编译安装:
l sudo apt-get install zlib1g-dev libsdl-dev
l 解压源代码后,进入源代码所在目录执行 ./confingure
l 执行make
l 执行sudo makeinstall
2.创建QEMU格式的硬盘
qemu-img create –f qcow2name.img size
例如:qemu-imgcreate –f qcow2 ubuntu10.04.img 4GB
3. 在创建的硬盘上安装操作系统
qemu –hda name.img –cdrom ~/Download/ubuntu10.04.iso –boot d
说明:使用hda指定硬盘镜像,使用CDROM选定光驱。-boot d指从cdrom启动,-boot a是软盘 ,-boot c 是硬盘;有时安装系统会很慢,这是可以考虑使用kvm来代替。
例如:kvm –hda ubuntu10.04.img –cdrom./ubuntu-10.04.iso -boot d
4. 从已经装好操作系统的硬盘启动
qemu –hda ubuntu10.04.img
5. 编译内核,参见一。
6. 使用qemu+gdb调试自己编译的Linux内核
a) 在运行make命令的目录下执行命令或写成shell脚本的形式,
qemu –s –S –hda ./ubuntu10.04.img –kernel./arch/x86/boot/bzImage –append root=/dev/sda
l -s表示运行虚拟机时将1234端口开启成调试端口;
l -S表示“冷冻”虚拟机,等待调试器发出继续运行命令;
l -kernel表示要调试的内核镜像;
l -append root=/dev/sda 表示传递给内核的参数。
b) 在另一个终端上运行gdb命令
l gdb vmlinux
l target remote localhost:1234
若到此没什么问题,你就可以发挥自己的聪明才智使用gdb的命令进行内核源代码的调试了。Gdb的命令参考:http://www.yolinux.com/TUTORIALS/GDB-Commands.html.
三、 使用systemtap调试内核
systemtap是内核的调试工具,它是在krobe、jprobe、kretprobe的基础上发展来的,使用systemtap就不用写内核模块,可以高效(快速、准确)的获取我们想知道的内核信息。有关systemtap的详细资料参加官方网站:http://sourceware.org/systemtap/
1.安装systemtap
我的主机系统ubuntu,systemtap的官网上提供了systemtap在ubuntu上的安装方法,在这不再详述。
2.systemtap入门
在systemtap的官网上提供了systemtap的参考文档以及比较多的参考例子,文档看一遍,例子运行一遍,便可以达到入门级。
3.sytemtap提高
systemtap最强大的部分便是可以使用embeddedc的形式,你用kprobe、jprobe、
kretprobe做的任何事情均可以转化成systemtap embedded c的形式,这里可以参见《systemtap使用日记》。