wenxiHuang 2011-06-01
之前都是用的bochs自带的debug功能,但是linux内核大部分都是用C语言来实现的,若仅通过反汇编的汇编来学习,太累了。。。
所以今天花了一个上午的时间,搭建起了bochs+gbd的联调huanjing。
安装环境:Ubuntu 11.04 (2.6.38) bochs 2.4.6 gdb 4.5.2
首先还是要安装bochs,仍然是推荐使用最新的版本(2.4.6),如果使用像2.3.6等老版本,也许会导致后面与gdb无法远程连接(NND,就是这个恶心的问题浪费了我几个小时。。。) linux上还是要从bochs的源码编译开始安装,bin文件安装的版本无法提供调试功能。配置bochs源码时,输入命令 ./configure --enable-gdb-stub,然后使用make和sudo make install命令完成安装。
安装时可能会遇到X windows库不全的情况,可以通过apt-get安装xorg-dev解决。
接着是配置bochs虚拟机环境,配置一个.bxrc文件和生产一个根文件系统镜像文件,建议直接到oldlinux上下载一个linux-0.11-gdb-rh9-050619.tar.gz,其中已经包含了配置好的这两个文件,另外在linux文件夹下有linux0.11的源码。
.bxrc文件中主要是添加了一条调试信息
gdbstub: enable=1, port=1234, text_base=0, data_base=0, bss_base=0
另外,这个bxrc文件中需要稍稍修改一些东西:
1. romimage: file=$BXSHARE/BIOS-bochs-latest, address=0xf0000
改成 romimage: file=$BXSHARE/BIOS-bochs-latest
2. floppy_command_delay: 50000
改成 #floppy_command_delay: 50000
3.ips: 4000000
改成 cpu: count=1, ips=4000000
接着就可以来进行联调了。
1. 打开两个终端。
2. 一个终端进入到linux-gdb-rh9/,运行程序"./run",此时窗口显示等待信息“wait for gdb connection on localhost:1234”
3. 另一个终端进入linux-gdb-rh9/linux/,运行 gdb tools/system
4. 在gdb窗口中输入b main(在main函数处下断)
5. 输入target remote localhost:1234 ,连接到bochs虚拟机上
6. 输入c,让程序持续运行,直到终端在main函数中
7. 可以开始使用gdb进行源码调试了^_^
之后可以对源代码进行修改再调试。需要注意的是,早期源码默认的汇编编译器为gas,链接器为gld,所以在Makefile文件中显示声明as=gas ld=gld。而在ubuntu 11.04中,gcc早已成为默认的编译器了,所以如果是另外下载的源码,需要将Makefile中的as=gas ld=gld改成 as=as, ld=ld 。。。(这个修改确实比较2。。。)