Bochs原始碼安裝及執行除錯
最近在讀《Orange's一個作業系統的實現》,開始部分介紹了虛擬機器Bochs的安裝及除錯,本文把折騰過程做下記錄。 作業系統:Ubuntu10.04(最新的版本老是有問題) 軟體版本:bochs 2.3.5(和書中保持一致)
1 更新Ubuntu
由於ubuntu 10.04是很老的版本,早在2016年已停止了更新支援,直接sudo apt-get update會失敗,好在ubuntu提供了old-release的方案,通過編輯sources.list更新軟體源,開啟/etc/apt/sources.list,把裡面內容全部刪除(如果不放心,可以先將原檔案備份),然後換上如下地址:
deb http://old-releases.ubuntu.com/ubuntu lucid main restricted universe multiverse deb http://old-releases.ubuntu.com/ubuntu lucid-security main restricted universe multiverse deb http://old-releases.ubuntu.com/ubuntu lucid-updates main restricted universe multiverse deb http://old-releases.ubuntu.com/ubuntu lucid-proposed main restricted universe multiverse deb http://old-releases.ubuntu.com/ubuntu lucid-backports main restricted universe multiverse deb-src http://old-releases.ubuntu.com/ubuntu lucid main restricted universe multiverse deb-src http://old-releases.ubuntu.com/ubuntu lucid-security main restricted universe multiverse deb-src http://old-releases.ubuntu.com/ubuntu lucid-updates main restricted universe multiverse deb-src http://old-releases.ubuntu.com/ubuntu lucid-proposed main restricted universe multiverse deb-src http://old-releases.ubuntu.com/ubuntu lucid-backports main restricted universe multiverse
之後,依次執行如下命令,更新並安裝必要軟體 sudo apt-get update sudo apt-get install build-essential sudo apt-get install xorg-dev sudo apt-get install libgtk2.0-dev sudo apt-get install nasm
2 軟體編譯
1 解壓軟體包 tar -zxf bochs-2.3.5.tar.gz 2 進入bochs解壓目錄 cd bochs-2.3.5 3 配置,使能除錯和反彙編功能 ./configure --enable-debugger --enable-disasm 4 編譯 make 5 安裝(該步驟可不進行) sudo make install 編譯過程中可能有一個如下錯誤 symbols.cc:137: error: ISO C++ forbids declaration of ‘hash_map’ with no type 需要對./bx_debug/symbols.cc進行修改
using namespace std;
#ifdef __GNUC__ // 新加的,注意前後都是兩個下劃線
using namespace __gnu_cxx; // 新加的,注意前面是兩個下劃線
#endif // 新加的
struct symbol_entry_t;
3 執行例項
1 編輯boot.asm
org 07c00h ; 告訴編譯器程式載入到7c00處 mov ax, cs mov ds, ax mov es, ax call DispStr ; 呼叫顯示字串例程 jmp $ ; 無限迴圈 DispStr: mov ax, BootMessage mov bp, ax ; ES:BP = 串地址 mov cx, 16 ; CX = 串長度 mov ax, 01301h ; AH = 13, AL = 01h mov bx, 000ch ; 頁號為0(BH = 0) 黑底紅字(BL = 0Ch,高亮) mov dl, 0 int 10h ; 10h 號中斷 ret BootMessage: db "Hello, OS world!" times 510-($-$$) db 0 ; 填充剩下的空間,使生成的二進位制程式碼恰好為512位元組 dw 0xaa55 ; 結束標誌
2 生成引導檔案boot.bin
nasm boot.asm -o boot.bin
3 製作虛擬硬碟
dd if=boot.bin of=a.img bs=512 count=1
4 編輯配置檔案bochsrc
###############################################################
# Configuration file for Bochs
###############################################################
# how much memory the emulated machine will have
megs: 32
# filename of ROM images
romimage: file=./bios/BIOS-bochs-latest
vgaromimage: file=./bios/VGABIOS-lgpl-latest
# what disk images will be used
floppya: 1_44=a.img, status=inserted
# choose the boot disk.
boot: floppy
# where do we send log messages?
# log: bochsout.txt
# disable the mouse
mouse: enabled=0
# enable key mapping, using US layout as default.
keyboard_mapping: enabled=1, map=./gui/keymaps/x11-pc-us.map
注意配置檔案中的相對路徑
5 執行例項
bochs -f bochsrc 輸入6回車 輸入c回車 可見虛擬機器已按照程式輸出"Hello, OS world!",輸入exit退出執行。