最近学习arm时钟机制,在读linux代码的时候,感觉有好多东西不是很直观,就决定用kgdb来跟踪代码执行过程,下面就介绍一下怎么实现的,其实很简答:
1,首先你当然需要一个交叉工具的gdb,我之前博客里用的是arm-2010q1-202-arm-none-linux-gnueabi.bin,在这里面你会发现有arm-none-linux-gnueabi-gdb,有这个就可以了。
2,编译内核,我基本用的是versatile的默认配置文件,因为我用qemu模拟的versatilepb,如果要用kgdb,得打开kernel hacking里面的compile kernel info选项,其它的可以 不选。
3,开启虚拟机,我用以下命令:
#qemu-system-arm -s -S -M versatilepb -m 256M -kernel $load_kernel -append "root=/dev/nfs nfsroot=192.168.1.208:/mnt/sdb1/ARM_XM_QEMU/FS ip=192.168.1.202:192.168.1.208:192.168.1.1:255.255.255.0 console=ttyAMA0 " -net nic,vlan=0 -net tap,vlan=0,ifname=tap0,script=/etc/qemu-ifup -nographic
4,另开启一个终端,进到linux 内核的目录。
$arm-none-linux-gnueabi-gdb vmlux
$target remote :1234
$设置断点
$c //因我qemu用了-S,所以在启动的时候cpu会停止,这样就可以调试跟踪内核启动时候的步骤。
ok,现在就可以跟操作gdb一样操作它了,
NOTE:上述qemu启动命令里面的-s 指的是qemu 里面gdb调试,-S是系统开启的时候停止,类似于两个真是机器之间用kgdb调试的时候里grub里的kgdbwait一样,可以看出qemu调试很方便,只需要加上这两个,就可以调试内核,或者其他东西。