Ubuntu 12.10安装Bochs 2.6, 调试linux-0.11内核

http://blog.csdn.net/sinzou1/article/details/5903968

Linux(ubuntu)安装bochs

http://wenku.baidu.com/view/f968e23b0912a21614792914.html

ubuntu下安装bochs

http://www.linuxidc.com/Linux/2011-07/38371.html

Ubuntu 10.04安装Bochs 2.4.5笔记

http://blog.csdn.net/traceless/article/details/3200169

bochs的安装与使用

http://hi.baidu.com/_0x55aa/item/38e3ac01d72f0e1bcc34eae6

linux bochs的启动

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

前言:
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

如果出现X windows libraries were not found错,可以用SUSE YaST的 软件管理 搜索xorg,将xorg的基本安装包安装即可,如下图所示:

如果出现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

里面两处做改动:

1、vgaromimage: $BXSHARE\VGABIOS-lgpl-latest反斜杠更改得到

vgaromimage: $BXSHARE/VGABIOS-lgpl-latest

2、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/sh
find . -name ‘*.*‘ |while read filename;do
mv $filename .
done
然后在linux目录下执行
# ./mv_file
将所有源码文件移动到当前目录,然后再调试就正常了。

Ubuntu 12.10安装Bochs 2.6, 调试linux-0.11内核

时间: 07-22

Ubuntu 12.10安装Bochs 2.6, 调试linux-0.11内核的相关文章

Ubuntu 12.10 安装JDK7

1.首先到oracle下载上下载jdk-7u25-linux-i586.tar.gz 2.将jdk-7u25-linux-i586.tar.gz拷贝到/usr/lib/jvm/目录下面,这里如果没有jvm文件夹,则创建该文件夹 sudo mkdir jvm  //创建文件夹jvm sudo cp -r  ~/download/jdk-7u25-linux-i586.tar.gz   /usr/lib/jvm sudo tar -xzvf jdk-7u25-linux-i586.tar.gz 3.

Ubuntu 12.10 安装vim出错

在Ubuntu 12.10中安装vim时出现了如下提示: 正在读取软件包列表... 完成正在分析软件包的依赖关系树 正在读取状态信息... 完成 有一些软件包无法被安装.如果您用的是 unstable 发行版,这也许是因为系统无法达到您要求的状态造成的.该版本中可能会有一些您需要的软件包尚未被创建或是它们已被从新到(Incoming)目录移出.下列信息可能会对解决问题有所帮助:下列软件包有未满足的依赖关系: vim : 依赖: vim-common (= 2:7.3.429-2ubuntu2.1

Linux 0.12和Linux 0.11内核学习——Google邮件列表

亲,你在学习Linux 0.12或0.11内核吗?快来加入我们吧,就缺你了!!! 为什么选用邮件列表呢?因为赵炯博士那个论坛交流不是很方便,经常发了贴没人回,人气相比十年前论坛刚成立时弱了不少.很多人,很多元老级别的人物,消失了...再也没有出现过. 而QQ群很繁杂,比如你肯定会因为一些兴趣爱好加入一些QQ群,但是也就刚加进去或者自己有什么要问的时候说几句,之后就屏蔽了,因为每天都有人在聊天,什么内容都有,想退群却又怕以后有用,不退吧又很烦,只能屏蔽了潜水. 而邮件列表,你可以订阅主题,实时追踪

Ubuntu 13.04/12.10安装Oracle 11gR2图文教程(转)

Ubuntu 13.04/12.10安装Oracle 11gR2图文教程 原文标题:How to Install Oracle 11G R2 Enterprise Edition Database Ubuntu 12.10 / 12.04 注:原文出自:http://www.techienote.com/tag/oracle-database-11g-r2-on-ubuntu-12-04 Following is the how to for installing Oracle Database

Ubuntu 12.10 server 安装 Jenkins(搭建)

1.查看Java 是否安装 java -version 2.安装Jenkins wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add - sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list' sudo apt-get update su

在Ubuntu 12.10上安装VirtualBox

首先,根据以下官方指引进行安装: https://www.virtualbox.org/wiki/Linux_Downloads 因此,根据你的操作系统的版本号在/etc/apt/sources.list添加以下记录: deb http://download.virtualbox.org/virtualbox/debian trusty contrib deb http://download.virtualbox.org/virtualbox/debian saucy contrib deb h

解决Ubuntu 12.10中ZIP文件名乱码的方法

转摘源地址:http://blog.csdn.net/jiangxinyu/article/details/8206395 安装(12.04及以上): 代码: sudo apt-get install unar 假设需要解压的ZIP包是foo.zip 代码: lsar foo.zip #列出所有文件 如果列出的文件名已经正确 代码: unar foo.zip #解压所有文件 如果列出的文件名还不正确 代码: lsar -e GB18030 foo.zip #指定使用GB18030编码列出所有文件

Ubuntu 12.04 安装配置 Apache2

Apache2安装 1 我们使用root账户进行安装,首先切换到root账户,输入命令: sudo su 2 安装 Apache2 apt-get install apache2 在浏览器输入你服务器ip地址列入,如http://10.103.30.201.查看Apache2是否工作,如果显示(It works!),说明已经工作. Apache 在 Ubuntu 中默认文档根目录为 /var/www,配置文件 /etc/apache2/apache2.conf,额外配置存储子目录 /etc/ap

Ubuntu 14.10安装SecureCRT 7.3

Ubuntu 14.10下安装SecureCRT 7.3 1.软件准备 Ubuntu14.10 x64 SecureCRT7.3的版本:scrt-7.3.0-657.ubuntu13-64.x86_64.deb 下载地址:http://www.vandyke.com/download/securecrt/download.html 或到Linux公社1号服务器下载 ------------------------------------------分割线---------------------