今天就跟大家聊聊有關(guān)Ubuntu 12.10安裝Bochs 2.6及調(diào)試linux-0.11內(nèi)核的操作過(guò)程,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名申請(qǐng)、網(wǎng)頁(yè)空間、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、鐵門(mén)關(guān)網(wǎng)站維護(hù)、網(wǎng)站推廣。
http://blog.csdn.net/sinzou1/article/details/5903968
http://wenku.baidu.com/view/f968e23b0912a21614792914.html
http://www.linuxidc.com/Linux/2011-07/38371.html
Ubuntu 10.04安裝Bochs 2.4.5筆記
http://blog.csdn.net/traceless/article/details/3200169
http://hi.baidu.com/_0x55aa/item/38e3ac01d72f0e1bcc34eae6
linux bochs的啟動(dòng)
本文介紹在SUSE Linux Enterprise Desktop系統(tǒng)下如何使用bochs調(diào)試內(nèi)核linux-0.11版本
前言:
linux-0.11雖然是早期內(nèi)核代碼,代碼不超過(guò)2萬(wàn)行,但卻基本是現(xiàn)今內(nèi)核代碼的精簡(jiǎn)版本,麻雀雖小,五臟俱全.
閱讀理解完整代碼,可以對(duì)整個(gè)系統(tǒng)的運(yùn)作過(guò)程有深刻理解.
一. 準(zhǔn)備工作(以root用戶執(zhí)行):
下載調(diào)試工具bochs:
在http://sourceforge.net/projects/bochs/下載.tar.gz的安裝包,注意,不要下載rpm包,因?yàn)榘惭b時(shí)需要加入gdb-stub功能,rpm包不帶有這個(gè)功能,下載后執(zhí)行:
tar zxvf bochs-2.3.5.tar.gz
cd bochs-2.3.5
./configure --enable-gdb-stub
如果出現(xiàn)X windows libraries were not found錯(cuò),可以用SUSE YaST的 軟件管理 搜索xorg,將xorg的基本安裝包安裝即可,如下圖所示:
如果出現(xiàn)error: X11/extensions/Xrandr.h: No such file or directory就
sudo apt-get install xorg-dev
另外可能要安裝g++,用SUSE YaST的 軟件管理 搜索gcc安裝即可
繼續(xù)安裝bochs
make
make install
好了,下載linux-0.11內(nèi)核源碼包,將源碼包放在/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
這個(gè)源碼包最終要放到bochs仿真的系統(tǒng)里去編譯,因?yàn)檎{(diào)試環(huán)鏡是以bochs仿真的Intel x86軟件,所以不要在SUSE系統(tǒng)編譯這個(gè)內(nèi)核,
而且在bochs仿真系統(tǒng)里編譯這個(gè)內(nèi)核還要更改一些配置文件,操作如下:
cd linux-0.11
vi Makefile
更改 RAMDISK = #-DRAMDISK=512為 RAMDISK = -DRAMDISK=2048
更改 ROOT_DEV=/dev/hd6 為ROOT_DEV=FLOPPY
在源碼目錄下所有的Makefile中
LDFLAGS = -M -x //去掉-s標(biāo)志
CFLAGS = Wall -O -g -fstrength-reduce -fomit-frame-pointer -fcombine-regs //添加-g標(biāo)志,去掉-mstring-insns
將boot/bootsect.s和tools/build.c中的SYSSIZE的值改為0x8000
由于Makefile文件較多,這里我寫(xiě)了一個(gè)腳本程序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目錄下,執(zhí)行一遍即可.
cd linux-0.11
./adjust_make_for_gdb
執(zhí)行完,打包此源碼.
cd ..
tar cvf gdb-linux-0.11.tar linux-0.11
這里附上我的gdb-linux-0.11.tar文件
二. 使用bochs
這里需要到http://oldlinux.org/Linux.old/bochs/下載兩個(gè)包
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
將這兩個(gè)包放到/root/kernel/,并解壓
tar zxvf linux-0.11-050518-rh9.tar.gz(原文為 linux-0.11-040923-rh9.tar.gz,我在解壓出來(lái)的文件中找不到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
里面兩處做改動(dòng):
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
這時(shí)候就可以運(yùn)行bochs了.
#bochs -q -f bochsrc-hdboot.bxrc
----- 發(fā)生錯(cuò)誤以及解決辦法 -----
如果運(yùn)行正常,會(huì)得到如下圖所示:
(1) >>PANIC<< bochsrc-hd.bxrc:37: vgaromimage directive malformed.
A. 注釋掉相應(yīng)行
B. 改成:vgaromimage: file=/usr/share/bochs/VGABIOS-lgpl-latest
(2) >>PANIC<< bochsrc-hd.bxrc:284: directive 'floppy_command_delay' not understood
A. 注釋掉相應(yīng)行
(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'.
進(jìn)入到目錄查看,發(fā)現(xiàn)/usr/share/bochs/目錄下面并沒(méi)有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
上圖顯示了虛擬硬盤(pán)的4個(gè)分區(qū),第一個(gè)分區(qū)放著可啟動(dòng)的Linux 0.11系統(tǒng),按數(shù)字1鍵運(yùn)行Linux 0.11系統(tǒng),我最終會(huì)在這個(gè)系統(tǒng)編譯Linux 0.11內(nèi)核代碼:
在linux-0.11-devel-050518 目錄還有其它的.bxrc文件:
bochsrc-fda.bxrc bochsrc-fdb.bxrc bochsrc-hd.bxrc
這里不再使用,感興趣的可以自己試試,關(guān)于bochs使用方法,可以去
http://bochs.sourceforge.net查詢
三. 向bochs的仿真系統(tǒng)復(fù)制源碼文件
能運(yùn)行了上面的bochsrc-hdboot.bxrc,現(xiàn)在就要把準(zhǔn)備工作時(shí)的gdb-linux-0.11.tar放到這個(gè)系統(tǒng)里了.
原理就是通過(guò)虛擬軟盤(pán)(1.44M)相互拷貝文件.
在linux-0.11-devel-050518 目錄,可以看到diska.img和diskb.img,復(fù)制一個(gè).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復(fù)制進(jìn)虛擬軟盤(pán)
# cp ../gdb-linux-0.11.tar ./
# cd ../linux-0.11-devel-050518
# umount tmp.img
運(yùn)行 bochs
# bochs -q -f bochsrc-hdboot.bxrc
按數(shù)字1鍵進(jìn)入系統(tǒng),點(diǎn)擊bochs工具欄的CONFIG,如圖紅圈位置:
然后切換回終端,可以看到如圖所示:
選擇1,更改第一個(gè)軟驅(qū),設(shè)置為剛才的tmp.img:
其余按默認(rèn)設(shè)置即可.
然后且換回bochs虛擬機(jī),這時(shí)系統(tǒng)的a:/軟驅(qū)就是tmp.img,將gdb-linux-0.11.tar復(fù)制到用戶目錄,解壓編譯:
# cd
# mcopy a:/gdb* ./
# tar xvf gdb*.tar
# cd linux-0.11
# make
成功后如圖所示生成Image System.map文件
四.將 bochs編譯好的文件和源碼打包,放回軟驅(qū)
由于軟驅(qū)大小是1.44M,而編譯后的代碼會(huì)很大,所以我是分批次將文件傳輸?shù)?
# 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
將軟盤(pán)中原來(lái)的文件刪除,把kernel.tar 分放進(jìn)軟盤(pán)( tools.tar linux.tar分別下次復(fù)制):
# mdel a:/gdb*
# mcopy kernel.tar a:/
然后在SUSE新開(kāi)一個(gè)終端,在 linux-0.11-devel-050518目錄掛載軟盤(pán):
# cd kernel/linux-0.11-devel-050518/
# mount -o loop tmp.img ../mount_img
# cd ../mount_img/
# mv kernel.tar ../linux-gdb-rh9/
回到bochs重新掛載軟盤(pán),方法在第二步已介紹(點(diǎn)擊CONFIG...),然后用同樣方法將 tools.tar linux.tar 復(fù)制到SUSE 的linux-gdb-rh9目錄
這里不再衍述.
復(fù)制完畢后即可關(guān)閉bochs,在linux-gdb-rh9目錄下,刪除原來(lái)的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 復(fù)制本目錄,在后面要用.
# cp ../linux-0.11-devel-050518/rootimage-0.11 ./
五. 開(kāi)始調(diào)試linux-0.11源碼
好了,在linux-gdb-rh9目錄運(yùn)行run文件:
./run
效果如圖:
這時(shí)bochs界面是黑屏,在運(yùn)行終端是
Waiting for gdb connection on port 1234
字樣.
新開(kāi)一個(gè)終端,進(jìn)入linux-gdb-rh9目錄下的linux目錄,運(yùn)行g(shù)db tools/system
# cd kernel/linux-gdb-rh9/linux/linux/
# gdb tools/system
在gdb 下運(yùn)行target remote localhost:1234
(gdb) target remote localhost:1234
運(yùn)行continue:
(gdb) continue
這時(shí),bochs界面會(huì)顯示如圖:
繼續(xù)運(yùn)行continue(直接按回車(chē)鍵),bochs 會(huì)提示Insert root floppy and press ENTER,這時(shí)點(diǎn)擊工具欄的CONFIG:
且換回bochs啟動(dòng)終端,選擇1,然后輸入 rootimage-0.11,其余按默認(rèn)設(shè)置,:
然后回到bochs界面按回車(chē)鍵,再切換到gdb終端,不停運(yùn)行 continue(不?;剀?chē)),最終界面會(huì)顯示如下圖:
Ok,現(xiàn)在就可以跟蹤每一步命令了:
gdb界面:
這時(shí)總會(huì)提示 filename: No such file or directory.
只要把所有源文件移動(dòng)到當(dāng)前目錄下即可,我用以下腳本mv_file實(shí)現(xiàn)
#!/bin/sh
find . -name '*.*' |while read filename;do
mv $filename .
done
然后在linux目錄下執(zhí)行
# ./mv_file
將所有源碼文件移動(dòng)到當(dāng)前目錄,然后再調(diào)試就正常了。
看完上述內(nèi)容,你們對(duì)Ubuntu 12.10安裝Bochs 2.6及調(diào)試linux-0.11內(nèi)核的操作過(guò)程有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。