记录一下一些有用的命令,免得时间长了自己也忘了。
这里讲的是利用qemu和gdb调试linux内核的准备过程。
1. 内核编译。
这个不讲了,其他地方描述的很多。三步:
-
# make menuconfig
-
# make
-
# 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命令进去然后重新压缩。
以超级用户的身份运行,方法是:
-
# mkdir initrd; cd initrd/ //临时文件夹
-
# cp /initrd.img ./initrd.cpio.gz //拷贝并改后缀
-
# gzip -d initrd.cpio.gz //gzip先解压,得到一个后缀为cpio的文件
-
# cat initrd.cpio | cpio -div //解压到当前文件夹。现在你能看到都是些什么了吧
现在你可以随便添加你想要的程序,比如你可以把当前系统内的/bin/uname 拷贝到 当前下面的bin下面
然后重新打包:
-
# rm initrd.cpio //这个要删掉,不要打在initrd里面
-
# find . | cpio -o -H newC > ../initrd.cpio
-
# cd ..
-
# gzip initrd.cpio
ok,新的initrd做好了,以后你想怎么改就怎么改了。
3. 设置qemu的启动选项。
apt-get 安装qemu,把kvm安装上就更好了。使用下面的来看qemu的启动参数设置:
-
#!/bin/sh
-
-
qemu-system-x86_64 \
-
-m 1024 -smp 2 \
-
-kernel $1 \
-
-initrd $2 \
-
-nographic \
-
-gdb tcp::1239 \
-
-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!
阅读(3183) | 评论(0) | 转发(0) |