環境:Ubuntu12.10 + bochs2.6.1
今天從圖書館借了本《一個操作系統的實現》,豆瓣評分挺高的,準備試試。拿到手後先翻了一下前幾頁,第一章1.1的準備工作裏寫着要一張軟盤,頓時傻眼,現在找臺有軟驅的電腦都難。連忙用手機百度一下,百度知道有個回答是用U盤代替軟盤,於是我果斷去校門口電子產品店買了個U盤(好慚愧,其實U盤早就該買一個的,需要的時候一直用手機、MP3、MP4以及郵箱神馬的代替)。回實驗室之後搞起~看了下前兩章,發現第二章開頭有句話“如果每次我們編譯好的東西都要寫到軟盤上,再重啓計算機,不但費時費力,對自己的愛機簡直是一種蹂躪。你一定不會滿足於這樣的現狀,還好,我們有如此多的工具,比如前面提到過的Bochs。” 好吧...看來書上有教程,那就照着一步一步做~
首先安裝Bochs。最簡單的方法是sudo apt-get install vgabios bochs bochs-x bximage,不過我沒用這種方法,書上說這種方法默認不開啓調試功能,所以我選擇從源代碼安裝。(吐槽一句,bochs.sourceforge.net上不去!!)我找到的最新版是2.6.1,找了個其他靠譜網站下載了下來。
tar vxzf bochs-2.6.tar.gz
cd bochs-2.6
./configure --enable-debugger --enable-disasm
make
sudo make install
make這步出問題了:gtk/gtk.h:沒有那個文件或目錄
解決方法是sudo apt-get install libgtk-3-dev libgtk2.0-dev (其實我也不知道這兩個之中哪個安裝上就可以解決,我都安了)
但是!!安完之後重新make後還是報錯,make clean也不好使,所以需要make dist-clean,然後重新執行上面的./configure --enable-debugger --enable-disasm和make和sudo make install
幸運的是,然後就不報錯了,接下來創建軟盤映像:輸入bximage,會有如下內容出現(需要用戶輸入的地方標爲加粗,當然括號裏的內容不是。。)
========================================================================
bximage
Disk Image Creation Tool for Bochs
$Id: bximage.c 11315 2012-08-05 18:13:38Z vruppert $
========================================================================
Do you want to create a floppy disk image or a hard disk image?
Please type hd or fd. [hd] fd(代表要創建軟盤映像)
Choose the size of floppy disk image to create, in megabytes.
Please type 0.16, 0.18, 0.32, 0.36, 0.72, 1.2, 1.44, 1.68, 1.72, or 2.88.
[1.44] 1.44
I will create a floppy image with
cyl=80
heads=2
sectors per track=18
total sectors=2880
total bytes=1474560
What should I name the image?
[a.img] (這個是默認名稱)
Writing: [] Done.
I wrote 1474560 bytes to a.img.
The following line should appear in your bochsrc:
floppya: image="a.img", status=inserted
將引導扇區寫入軟盤:dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
哦忘了說boot.bin怎麼生成的了。首先要安裝NASM,這個使用sudo apt-get install nasm就可以,下面是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 ;結束標誌
將這段代碼用NASM編譯一下:nasm boot.asm -o boot.bin,然後就可以執行上面的dd命令了~執行命令會出現下面三行:
記錄了1+0 的讀入
記錄了1+0 的寫出
512字節(512 B)已複製,6.8461e-05 秒,7.5 MB/秒
這時要在當前目錄下新建bochsrc文件,書上那段配置文件路徑需要修改一下(不能把bochs文件夾下的.bochsrc文件拷來直接用,會報錯unsupported CPU model option)
#how much memory the emulated machine will have
megs: 32
#filename of ROM images
romimage: file=/home/agul/others/bochs-2.6/bios/BIOS-bochs-latest
vgaromimage: file=/home/agul/others/bochs-2.6/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=/home/agul/others/bochs-2.6/gui/keymaps/x11-pc-us.map
啓動!!!boches -f bochsrc
接下來輸入6,便可以打開bochs了~等了好半天,還是一片黑,怎麼不出現Hello, OS world!呢?Bochs其實這時還沒運行,在終端輸入c然後按回車試試~~結果出現了
先寫到這兒了,明天再把第一二章看一下,理解一下代碼和怎麼用Bochs調試操作系統~