http://blog.csdn.net/sinzou1/article/details/5903968html
http://wenku.baidu.com/view/f968e23b0912a21614792914.htmllinux
http://www.linuxidc.com/Linux/2011-07/38371.htmlubuntu
Ubuntu 10.04安装Bochs 2.4.5笔记vim
http://blog.csdn.net/traceless/article/details/3200169windows
http://hi.baidu.com/_0x55aa/item/38e3ac01d72f0e1bcc34eae6less
linux bochs的启动工具
本文介绍在SUSE Linux Enterprise Desktop系统下如何使用bochs调试内核linux-0.11版本oop
前言:
linux-0.11虽然是早期内核代码,代码不超过2万行,但却基本是现今内核代码的精简版本,麻雀虽小,五脏俱全.
阅读理解完整代码,能够对整个系统的运做过程有深入理解.
一. 准备工做(以root用户执行):
下载调试工具bochs:
在http://sourceforge.net/projects/bochs/下载.tar.gz的安装包,注意,不要下载rpm包,由于安装时须要加入gdb-stub功能,rpm包不带有这个功能,下载后执行:
tar zxvf bochs-2.3.5.tar.gz
cd bochs-2.3.5
./configure --enable-gdb-stub
ui
若是出现X windows libraries were not found错,能够用SUSE YaST的 软件管理 搜索xorg,将xorg的基本安装包安装便可,以下图所示:spa
若是出现error: X11/extensions/Xrandr.h: No such file or directory就
sudo apt-get install xorg-dev
另外可能要安装g++,用SUSE YaST的 软件管理 搜索gcc安装便可
继续安装bochs
make
make install
好了,下载linux-0.11内核源码包,将源码包放在/root/kernel/:
mkdir /root/kernel
cd /root/kernel
wget http://www.kernel.org/pub/linux/kernel/Historic/old-versions/linux-0.11.tar.gz
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
这里须要到http://oldlinux.org/Linux.old/bochs/下载两个包
wget http://oldlinux.org/Linux.old/bochs/linux-0.11-devel-050518.zip
wget http://oldlinux.org/Linux.old/bochs/linux-0.11-gdb-rh9-050619.tar.gz
将这两个包放到/root/kernel/,并解压
tar zxvf linux-0.11-050518-rh9.tar.gz(原文为 linux-0.11-040923-rh9.tar.gz,我在解压出来的文件中找不到bochsrc-hdboot.bxrc文件,改为linux-0.11-050518-rh9.tar.gz就有了)
unzip linux-0.11-devel-050518.zip -d ./
cd linux-0.11-devel-050518/
这里咱们只用到bochsrc-hdboot.bxrc文件
vim 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
----- 发生错误以及解决办法 -----
若是运行正常,会获得以下图所示:
(1) >>PANIC<< bochsrc-hd.bxrc:37: vgaromimage directive malformed.
A. 注释掉相应行
B. 改为:vgaromimage: file=/usr/share/bochs/VGABIOS-lgpl-latest
(2) >>PANIC<< bochsrc-hd.bxrc:284: directive 'floppy_command_delay' not understood
A. 注释掉相应行
(3) bochsrc-hd.bxrc:194: unknown parameter for parport1 ignored.
4 Event type: PANIC
Device: [MEM0 ]
Message: ROM: couldn't open ROM image file '/usr/share/bochs/VGABIOS-lgpl-latest'.
进入到目录查看,发现/usr/share/bochs/目录下面并无VGABIOS-lgpl-latest文件
find / -name VGABIOS-lgpl-latest
/usr/local/share/bochs/VGABIOS-lgpl-latest
解决方案:将vgaromimage: $BXSHARE/VGABIOS-lgpl-latest 改成
vgaromimage: file=/usr/local/share/bochs/VGABIOS-lgpl-latest
上图显示了虚拟硬盘的4个分区,第一个分区放着可启动的Linux 0.11系统,按数字1键运行Linux 0.11系统,我最终会在这个系统编译Linux 0.11内核代码:
在linux-0.11-devel-050518 目录还有其它的.bxrc文件:bochsrc-fda.bxrc bochsrc-fdb.bxrc bochsrc-hd.bxrc这里再也不使用,感兴趣的能够本身试试,关于bochs使用方法,能够去http://bochs.sourceforge.net查询三. 向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,如图红圈位置:而后切换回终端,能够看到如图所示:选择1,更改第一个软驱,设置为刚才的tmp.img:其他按默认设置便可.而后且换回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文件四.将 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/shfind . -name '*.*' |while read filename;domv $filename .done而后在linux目录下执行# ./mv_file将全部源码文件移动到当前目录,而后再调试就正常了。