最近在讀《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!",Ctrl+C後輸入exit退出運行。