2012.03.19
网上时间过早的讲编译内核的文章完全不用看,比如什么讲kgdb的,现在这个东西早就被集成到内核里了。还有调试内核的一些允许kernel
debugging的选项,在新版本中也早已是默认选中了。
简单地说,qemu相当于一个虚拟化的工具。
编译过linux内核有两个部分,第一个是vmlinux文件,100多MB的样子,包含源代码的符号映射表;还有一个是bzImage,是压缩过的内核,只有几MB。
qemu上运行的内容为:内核bzImage +
磁盘镜像xxx.img。磁盘镜像可以用busybox制作,但是也可以从qemu官网下载已经制作好的(左边一栏选testing
qemu,有个文件叫linux-0.2.img),大约8MB。
qemu加这两个东西,就变成了一个完整的Linux系统
切记用chmod命令修改内核和磁盘镜像文件的权限,否则可能导致qemu不能正常读取。为了简单我直接chmod 777
xxx了(所有用户所有权限)。
#qemu-system-i386 -S -kernel bzImage -hda linux-0.2.img -append
root=/dev/sda
这就把磁盘镜像和内核挂载到qemu上了。此时qemu出现黑屏,按ctrl+alt+2进入命令行终端模式。
在qemu命令行中输入gdbserver,发现开始监听tcp:1234端口。(1234是qemu默认设置)
新开一个终端,输入 #gdb vmlinux,开始读取大内核及符号映射。设置断点 #br start_kernel
接着开始远程传输指令 #target remote localhost:1234
输入#c (continue),开始继续执行,此时内核会自动执行到start_kernel()函数并暂停。
高版本的C函数库编译的程序放在linux-0.2.img中可能会报错,是由于该文件系统中的C库过老导致的。编译时采用静态编译即可解决这一问题