《一個操作系統的實現》(零):搭建環境

環境: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調試操作系統~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章