Ubuntu 12.10安裝Bochs 2.6, 調試linux-0.11內核

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

Linux(ubuntu)安裝bochs

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

ubuntu下安裝bochs

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

bochs的安裝與使用

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將全部源碼文件移動到當前目錄,而後再調試就正常了。

相關文章
相關標籤/搜索