Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1898019
  • 博文数量: 383
  • 博客积分: 10011
  • 博客等级: 上将
  • 技术积分: 4061
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-24 18:53
文章分类

全部博文(383)

文章存档

2011年(1)

2010年(9)

2009年(276)

2008年(97)

我的朋友

分类: LINUX

2009-05-18 13:28:57


本文介绍在SUSE Linux Enterprise Desktop系统下如何使用bochs调试内核linux-0.11版本

前言:
linux-0.11虽然是早期内核代码,代码不超过2万行,但却基本是现今内核代码的精简版本,麻雀虽小,五脏俱全.
阅读理解完整代码,可以对整个系统的运作过程有深刻理解.

一. 准备工作(以root用户执行):
下载调试工具bochs:
在下载.tar.gz的安装包,注意,不要下载rpm包,因为安装时需要加入gdb-stub功能,rpm包不带有这个功能,下载后执行:
#tar  zxvf  bochs-2.3.5.tar.gz
#cd  bochs-2.3.5
#./configure  --enable-gdb-stub
如果出现X windows libraries were not found错,可以用SUSE YaST的 软件管理 搜索xorg,将xorg的基本安装包安装即可,如下图所示:
SUSE下使用bochs调试linux-0.11内核 - 橘子皮 - 橘子皮
另外可能要安装g++,用SUSE YaST的 软件管理 搜索gcc安装即可
继续安装bochs
#make
#make  install
好了,下载linux-0.11内核源码包,将源码包放在/root/kernel/:
#mkdir  /root/kernel
#cd  /root/kernel
#wget 
#tar   zxvf   linux-0.11.tar.gz
这个源码包最终要放到bochs仿真的系统里去编译,因为调试环镜是以bochs仿真的Intel x86软件,所以不要在SUSE系统编译这个内核,
而且在bochs仿真系统里编译这个内核还要更改一些配置文件,操作如下:
#cd linux-0.11
#vi Makefile
更改 RAMDISK = #-DRAMDISK=512为 RAMDISK = -DRAMDISK=2048
更改 ROOT_DEV=/dev/hd6 为ROOT_DEV=FLOPPY
在源码目录下所有的Makefile中
LDFLAGS = -M -x                  //去掉-s标志
CFLAGS = Wall -O -g -fstrength-reduce -fomit-frame-pointer  -fcombine-regs //添加-g标志,去掉-mstring-insns
将boot/bootsect.s和tools/build.c中的SYSSIZE的值改为0x8000
由于Makefile文件较多,这里我写了一个脚本程序adjust_make_for_gdb直接完成上述工作

#!/bin/sh

sed -i '5 s/#//' Makefile
sed -i '5 s/512/2048/' Makefile
sed -i '23 s/\/dev\/hd6/FLOPPY/' Makefile
sed -i '6 s/3/8/' boot/bootsect.s
sed -i '35 s/2/8/' tools/build.c


find . -name 'Makefile' |while read filename;do
    all_lines=$(grep LDFLAGS $filename -nH | awk -F: '{print $2}')
    first_line=$(echo $all_lines|awk '{print $1}')
    echo $first_line
    sed -i "$first_line s/-s//g" $filename

    all_lines=$(grep CFLAGS $filename -nH | awk -F: '{print $2}')
    first_line=$(echo $all_lines|awk '{print $1}')
    echo $first_line
    sed -i "$first_line s/-O -fs/-O -g -fs/g" $filename

    sed -i '1,$ s/-mstring-insns//g' $filename
done

将此脚本放在linux-0.11目录下,执行一遍即可.
#cd linux-0.11
#./adjust_make_for_gdb
执行完,打包此源码.
#cd ..
#tar  cvf  gdb-linux-0.11.tar   linux-0.11
这里附上我的gdb-linux-0.11.tar文件


二. 使用bochs
这里需要到下载两个包
#wget  linux-0.11-devel-050518.zip
#wget  linux-0.11-gdb-rh9-050619.tar.gz
将这两个包放到/root/kernel/,并解压
#tar zxvf   linux-0.11-040327-rh9.tar.gz
#unzip   linux-0.11-devel-050518.zip  -d  ./
#cd  linux-0.11-devel-050518/
这里我们只用到bochsrc-hdboot.bxrc文件
#vi   bochsrc-hdboot.bxrc
将里面的vgaromimage: $BXSHARE\VGABIOS-lgpl-latest反斜杠更改得到vgaromimage: $BXSHARE/VGABIOS-lgpl-latest
 romimage: file=$BXSHARE\BIOS-bochs-latest, address=0xf0000 更改得到
romimage: file=$BXSHARE/BIOS-bochs-latest
这时候就可以运行bochs了.
#bochs   -q  -f  bochsrc-hdboot.bxrc
如果运行正常,会得到如下图所示:
SUSE下使用bochs调试linux-0.11内核 - 橘子皮 - 橘子皮
上图显示了虚拟硬盘的4个分区,第一个分区放着可启动的Linux 0.11系统,按数字1键运行Linux 0.11系统,我最终会在这个系统编译Linux 0.11内核代码:
SUSE下使用bochs调试linux-0.11内核 - 橘子皮 - 橘子皮

在linux-0.11-devel-050518 目录还有其它的.bxrc文件:
bochsrc-fda.bxrc  bochsrc-fdb.bxrc  bochsrc-hd.bxrc
这里不再使用,感兴趣的可以自己试试,关于bochs使用方法,可以去
查询

三. 向bochs的仿真系统复制源码文件
能运行了上面的bochsrc-hdboot.bxrc,现在就要把准备工作时的gdb-linux-0.11.tar放到这个系统里了.
原理就是通过虚拟软盘(1.44M)相互拷贝文件.
在linux-0.11-devel-050518 目录,可以看到diska.img和diskb.img,复制一个.img文件:
#cd linux-0.11-devel-050518
#cp diska.img  tmp.img
#mkdir ../mount_img
# mount -o  loop tmp.img  ../mount_img/
# cd  ../mount_img/
将里面的文件全部删除
# rm   -rf   *
将gdb-linux-0.11.tar复制进虚拟软盘
# cp  ../gdb-linux-0.11.tar  ./
# cd ../linux-0.11-devel-050518
# umount   tmp.img
运行 bochs
#  bochs -q -f bochsrc-hdboot.bxrc
按数字1键进入系统,点击bochs工具栏的CONFIG,如图红圈位置:
SUSE下使用bochs调试linux-0.11内核 - 橘子皮 - 橘子皮

然后切换回终端,可以看到如图所示:
SUSE下使用bochs调试linux-0.11内核 - 橘子皮 - 橘子皮

选择1,更改第一个软驱,设置为刚才的tmp.img:
SUSE下使用bochs调试linux-0.11内核 - 橘子皮 - 橘子皮
其余按默认设置即可.

然后且换回bochs虚拟机,这时系统的a:/软驱就是tmp.img,将gdb-linux-0.11.tar复制到用户目录,解压编译:
# cd
# mcopy a:/gdb*   ./
# tar  xvf   gdb*.tar
# cd linux-0.11
# make
成功后如图所示生成Image System.map文件
SUSE下使用bochs调试linux-0.11内核 - 橘子皮 - 橘子皮

四.将 bochs编译好的文件和源码打包,放回软驱

由于软驱大小是1.44M,而编译后的代码会很大,所以我是分批次将文件传输的.

# cp   -r  kernel  ../

# cp   -r  tools   ../

# rm -rf  kernel  tools

# cd  ../

# tar cvf  kernel.tar  kernel

# tar cvf  tools.tar  tools

# tar cvf  linux.tar   linux-0.11

将软盘中原来的文件删除,把kernel.tar  分放进软盘( tools.tar  linux.tar分别下次复制):

# mdel  a:/gdb*

# mcopy  kernel.tar  a:/

然后在SUSE新开一个终端,在 linux-0.11-devel-050518目录挂载软盘:

# cd  kernel/linux-0.11-devel-050518/

# mount -o loop tmp.img ../mount_img

# cd  ../mount_img/

# mv   kernel.tar  ../linux-gdb-rh9/

回到bochs重新挂载软盘,方法在第二步已介绍(点击CONFIG...),然后用同样方法将 tools.tar  linux.tar  复制到SUSE 的linux-gdb-rh9目录

这里不再衍述.

复制完毕后即可关闭bochs,在linux-gdb-rh9目录下,删除原来的linux目录,将kernel.tar  tools.tar  linux.tar 解压到linux目录:

# rm -rf linux

# tar xvf linux.tar

# tar  xvf  tools.tar

# tar  xvf  kernel.tar

# mv   -f  kernel  linux-0.11

# mv   -f  tools    linux-0.11

# mv -f   linux-0.11 linux

将 linux-0.11-devel-050518目录的rootimage-0.11 复制本目录,在后面要用.

# cp ../linux-0.11-devel-050518/rootimage-0.11  ./

五. 开始调试linux-0.11源码

好了,在linux-gdb-rh9目录运行run文件:

./run

效果如图:

这时bochs界面是黑屏,在运行终端是

Waiting for gdb connection on port 1234

字样.

新开一个终端,进入linux-gdb-rh9目录下的linux目录,运行gdb tools/system

# cd   kernel/linux-gdb-rh9/linux/linux/

# gdb   tools/system

在gdb 下运行target remote localhost:1234

(gdb) target  remote  localhost:1234

运行continue:

(gdb) continue

这时,bochs界面会显示如图:

继续运行continue(直接按回车键),bochs 会提示Insert root floppy and press ENTER,这时点击工具栏的CONFIG:

 

且换回bochs启动终端,选择1,然后输入 rootimage-0.11,其余按默认设置,:

然后回到bochs界面按回车键,再切换到gdb终端,不停运行 continue(不停回车),最终界面会显示如下图:

Ok,现在就可以跟踪每一步命令了:

gdb界面:

这时总会提示 filename: No such file or directory.

只要把所有源文件移动到当前目录下即可,我用以下脚本mv_file实现

#!/bin/sh

find . -name '*.*' |while read filename;do

    mv $filename .

done

然后在linux目录下执行

# ./mv_file

将所有源码文件移动到当前目录,然后再调试就正常了。

阅读(3226) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

cmk1282010-05-14 15:22:16

http://peter-bochs.googlecode.com 一个专为操作系统开发者與及汇编高手而设的x86-ia32调试器