Chinaunix首页 | 论坛 | 博客
  • 博客访问: 273929
  • 博文数量: 18
  • 博客积分: 787
  • 博客等级: 军士长
  • 技术积分: 235
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-27 21:20
文章分类

全部博文(18)

文章存档

2015年(2)

2013年(2)

2012年(7)

2011年(1)

2010年(6)

分类: LINUX

2015-02-14 20:58:40

记录一下一些有用的命令,免得时间长了自己也忘了。
这里讲的是利用qemu和gdb调试linux内核的准备过程。
1. 内核编译。
这个不讲了,其他地方描述的很多。三步:

点击(此处)折叠或打开

  1. # make menuconfig
  2. # make
  3. # sudo make modules_install

编译完毕之后,会生成几个比较重要的文件
  • linux/vmlinux: 内核文件,未压缩版的,带有内核的符号表等调试信息
  • linux/arch/x86/boot/bzImage: vmlinux的压缩版,可以用qemu启动的kernel
内核生成完毕了。
如果想要在开机选项中看到新编译的内核。多加一步安装过程:
# sudo make install

2. 生成initrd
kernel有了,但是没有rootfs或者initramfs,qemu还是会启动失败的。这个东西是用户空间,上面的kernel自然是内核空间。
用qemu正常调试,当然二者都少不了。我们就把initramfs当做rootfs使用就可以了。
以我的ubuntu 14.10为例,系统自带了一个可启动的initrd,文件为/initrd.img。但是有时候这个文件内缺少你想要的东西,
比如少个uname命令之类的。那就需要把它解压然后打个uname命令进去然后重新压缩。
以超级用户的身份运行,方法是:

点击(此处)折叠或打开

  1. # mkdir initrd; cd initrd/ //临时文件夹
  2. # cp /initrd.img ./initrd.cpio.gz //拷贝并改后缀
  3. # gzip -d initrd.cpio.gz //gzip先解压,得到一个后缀为cpio的文件
  4. # cat initrd.cpio | cpio -div //解压到当前文件夹。现在你能看到都是些什么了吧


现在你可以随便添加你想要的程序,比如你可以把当前系统内的/bin/uname 拷贝到 当前下面的bin下面
然后重新打包:

点击(此处)折叠或打开

  1. # rm initrd.cpio //这个要删掉,不要打在initrd里面
  2. # find . | cpio -o -H newC > ../initrd.cpio
  3. # cd ..
  4. # gzip initrd.cpio

ok,新的initrd做好了,以后你想怎么改就怎么改了。

3. 设置qemu的启动选项。
apt-get 安装qemu,把kvm安装上就更好了。使用下面的来看qemu的启动参数设置:

点击(此处)折叠或打开

  1. #!/bin/sh
  2. qemu-system-x86_64 \
  3. -m 1024 -smp 2 \
  4. -kernel $1 \
  5. -initrd $2 \
  6. -nographic \
  7. -gdb tcp::1239 \
  8. -append "earlyprintk=ttyS0 console=ttyS0,115200 bootmem_debug crashkernel=128M root=/dev/ram0 rdinit=/sbin/init"

保存为bootqemu.sh,然后运行./bootqemu.sh arch/x86/boot/bzImage /initrd.cpio.gz 就可以看到内核运行了!

4. 使用gdb调试内核
假设当前的linux源码目录下
则 运行gdb ./vmlinux,即gdb加载kernel image,获取其中的符号表。
然后 target remote :1239 远程连接到本地的1239号端口。
注意1239实质上是qemu启动的时候使用-gdb选项设置的调试端口。
然后可以break 某个函数,其他的都跟普通应用的gdb调试方法相同了!

开始你的内核调试之旅吧!
Enjoy it!



阅读(3166) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~