解剖linux内核之工具

来源:互联网 发布:知豆电动汽车地址 编辑:程序博客网 时间:2024/05/16 08:18


HaiPeng(lzuzhp@gmail.com)

         要能够深入到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使用日记》。
原创粉丝点击