1. 程式人生 > >Ubuntu 12.10安裝Bochs 2.6, 除錯linux-0.11核心

Ubuntu 12.10安裝Bochs 2.6, 除錯linux-0.11核心

Linux(ubuntu)安裝bochs

ubuntu下安裝bochs

Ubuntu 10.04安裝Bochs 2.4.5筆記

bochs的安裝與使用

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核心

Linux(ubuntu)安裝bochs ubuntu下安裝bochs Ubuntu 10.04安裝Bochs 2.4.5筆記 bochs的安裝與使用 linux bochs的啟動 本文介紹在SUSE Linux Enterprise Des

利用bochs除錯linux 0.11核心

此時Bochs除錯系統已經準備好開始執行,CPU執行指標已指向ROM BIOS中地址0x000fffff0處的指令處。其中'<bochs:1>'是命令輸入提示符,其中的數字表示當前的命令序列號。在命令提示符'<bochs:1>'後面鍵入'help'命令,可以列出除錯系統的基本命令。

ubuntu 8.10bochs 2.3.7原始碼包的編譯安裝

在ubuntu 8.10下安裝成功,分為以下四步:一、準備工作bochs是由C++編寫的,我們要安裝相應的編譯環境sudo apt-get install build-essential如果要圖形介面,sudo apt-get install xorg-dev安裝bison,sudo apt-get inst

ubuntu 17.10 安裝opencv3.2.0

硬體:機械師T58D 系統:ubuntu17.10 opencv版本3.2.0 1、安裝依賴庫: sudo  apt-get update sudo apt-get upgrade sudo apt-get install build-essential cma

Ubuntu 12 04安裝Redmine 2 4 2

                官方安裝文件參考:首先安裝MySQL, 參考:建立Redmin資料庫和使用者mysql -u root -p CREATE DATABASE redmine CHARACTER SET utf8;CREATE USER 'redmine'@'localhost' IDENTIF

解決在ubuntu 12.10安裝vmware-tools實現檔案共享問題

解決在ubuntu 12.10安裝vmware-tools出現的“The path "" is not a valid path to linux-headers-3.5.0-17 ”或者“The path "" is not a valid path to linux-

Linux上編譯安裝Bochs 2.6.9和QEMU 4.0.0-rc0的方法

開發十年,就只剩下這套架構體系了! >>>   

ubuntu 12.04編譯及除錯linux-0.11

(更新中.....) 最近開始研究linux-0.11,編譯過程就遇到各種奇葩情況......好不容易編譯通過了....可是還是不能載入執行.... 下面是我學習過程記錄: 1.開始我用gcc-3.2.2-5.i386.rpm編譯linux-0.11, 你也知道rpm包在u

學習linux-0.11核心——搭建環境(編譯、除錯bootsec)

前言 本博文是本專欄博文的起點,通過本文的學習,通過qemu虛擬機器將linux-0.11核心跑起來,有了這個可以跑的核心,在有疑問的地方,我們就可以通過除錯的方式來學習核心。 編譯核心 獲取核心程式碼 git clone https://github.com/

Ubuntu Kylin15.10下IDL8.2安裝及破解步驟(含找不到libXp.so.6的解決辦法,已自測通過)

############ license file comments, do not delete############### # License Number(s):705016 SERVER hostname bc305bd94286 1700 USE_SERVER DAEMON idl_lmgrd I

ubuntu18.04 下bochs-2.6.7 安裝的總結(試驗成功後搬運)

先下載bochs,版本隨意⼀般最新版即可,我裝的是bochs-2.6.7,直接去官⽹的最下⾯找到下載區,點擊⼀個版本之後會跳轉到更詳細的下載⻚⾯,我們是linux系統所以選擇bochs-2.6.7.tar.gz這種的壓縮格式。下載完成後開始解壓,在Ubuntu下按 Ctrl+

Ubuntu 15.10 安裝 小米/360 2代等隨身WIFI驅動

從抽屜裡翻出來了兩個以前的隨身WIFI,因為母上大人要用,就拿出來再電腦上試了下。剛好有個Ubuntu15.04的虛擬機器,就在虛擬機器裡面試了下,按照這個帖子裡的步驟安裝驅動,可以使用360隨身WIFI 2代。但是用小米隨身WIFI的時候就不能用了,在論壇上也找了幾個帖子

Ubuntu 15.10 安裝 php7.0.6 + nginx-1.9.3(ubuntu)

安裝php-7.0.6 步驟 和配置 (Ubuntu 15.10) 下載php-7.tar.gz 包 安裝一系列需要的依賴包 sudo apt-get update sudo apt-get install libxml2-dev 安裝gcc

Android雜談--ubuntu 12.10 系統下adb連線小米2

手機利用USB連線到Ubuntu 12.04系統。執行下面的命令: [email protected]:/media/DATA/Java-linux/android-sdk-linux/platform-tools$ lsusb Bus 001 Device

Ubuntu 12.10 下MySQL 5.1.65 解壓安裝

1. 下載http://downloads.mysql.com/archives/mysql-5.1/mysql-5.1.65-linux-i686-glibc23.tar.gz2、解壓gunzip mysql-5.1.65-linux-i686-glibc23.tar.gz

Ubuntu 9.10安裝minigui1.6.10 GPL詳細記錄

MiniGUI 技術白皮書 for V2.0.4/1.6.10 [PDF]:該文件描述了 MiniGUI V2.0.4/1.6.10 的技術特性。 Datasheet for MiniGUI V2.0.4/1.6.10 [PDF]:該文件對 MiniGUI V2.0.4/1.6.10 產品功能特性進行了詳盡的

【ejabberd】安裝XMPP伺服器ejabberd(Ubuntu 12.10

ejabberd ejabberd is a free and open source instant messaging server written in Erlang/OTP.ejabberd is cross-platform, distributed, fault-tolerant, and ba

ubuntu 12.10的vmware虛擬機器中連線android手機裝置除錯

手機是盛大bambook s1,系統大約是android 2.3.5左右。 win7 64位版上安裝的vmware 8.0,裝了ubuntu 12.10系統(來自於python for android的 kivy映象盤,由原來的vdi(virtual box)格式轉化而來

Ubuntu 12.04 安裝Tomcat7

選擇 ubun 成功 rtu 配置 宋體 pac nload ria 1.下載Tomcat7 打開Tomcat官網 http://tomcat.apache.org,在左邊的導航欄的“Download"中找到Tomcat7.0目錄,點擊後進入Tomcat7的頁面,選擇

Ubuntu 14.04 安裝 Java JDK (6步)

span color 最新 tor javac alt 擴展 dir title 從Oracle下載JDK最新版,附下載地址 下載後得到文件jdk-8u101-linux-x64.tar.gz(文件名可能不同,下載擴展名為.tar.gz的即可), 在命令行輸入以下代碼解壓