Linux内核调试
本篇文章将介绍如何进行Linux的内核调试,我们的环境如下:
主机:Ubuntu 11.04
虚拟机:VirtualBox的Ubuntu11.04
首先做如下准备工作:
1.
主机和虚拟机之间要可以共享文件,我用的是Samba,参见:http://blog.csdn.net/htttw/article/details/7216149
2.
主机和虚拟机要可以通过串口通信,参见:http://blog.csdn.net/htttw/article/details/7221510
本次实验就相当于对之前实验的小小总结啦~~
准备完之后,就可以开始了:
1.
首先我们先准备好内核镜像bzImage和Busybox文件系统initrd.gz,制作方法可以参考:
http://blog.csdn.net/htttw/article/details/7215858
这里我们为了加快编译bzImage的速度,所以精简了Linux内核,具体参考:http://blog.csdn.net/htttw/article/details/7262239
2.
在主机上打开minicon:
minicon
3.
第一步的两个文件准备好后就可以启动虚拟机了,出现grub菜单,以前的实验都是按“c”后进入grub命令模式,然后输入“linux”,“initrd”来指定内核镜像和文件系统,这对于本实验是不够的,我们还需要把虚拟机的输出信息通过串口送到我们的主机上,但我摸索了很久还是没有找到如何在grub命令模式下设置串口的命令,所以,我们换另一钟方法:
在grub菜单中选择一项菜单项,按“e”编辑该菜单项,把原有的命令全部删除,然后输入以下语句:
linux /boot/bzImage console=tty0 console=ttyS0, 115200
initrd /boot/initrd.gz
就可以了,然后按F10启动。
4.
这样的话,在我们主机的minicom中就会出现虚拟机从串口输出的信息啦~~
而且,在虚拟机进入Busybox后,直接在主机的minicom中输入命令就可以直接操作虚拟机啦,如图~~
以上的操作全部在主机的minicom中完成
5
由于我的笔记本没有串口,所以在gdb中执行target remote /dev/ttyS0时会出错!错误信息:/dev/ttyS0 输入/输出错误,所以我们可以把命名管道/tmp/vbox重定向到某个端口,然后就可以啦,我们使用socat命令:
sudo apt-get install socat
socat tcp4-listen:8888 /tmp/vbox
表示把命名管道/tmp/vbox的输出重定向到tcp的8888端口
然后在gdb中输入:
set remotebaud 115200
target remote tcp:localhost:8888
就可以了
后面呢?