??下面正式進入實操環節,也就是動手搭建作業系統,看著眼前的Windows/Linux/Mac OS/etc,相信絕大多數同學都會感到興奮和迷茫:這么大個作業系統,從哪里開始呢?古人有云:“工欲善其事,必先利其器,”我們得以發揮自己聰明才智,進行學習研究創造的前提,是擁有一個好的工具,它能讓我們在巨人的肩膀上欣賞與創造,在這里,我想表達對所有在相關領域為后人的方便貢獻自己汗水的前輩的衷心的感謝與欽佩,
??話不多說,接下來我們正式切入正題:配置除錯作業系統所需的環境,
- C/C++編譯器,這里采用gcc/g++方案
- 匯編器,我們將使用較新的NASM作為我們的匯編器
- 虛擬機/模擬器:接下來就歡迎我們今天的主角——Bochs!
簡介
??Bochs(發音同"Box"),是一款開源,使用C++撰寫的,高度便攜的 IA-32(X86)架構PC模擬器,它包含了對Intel x86架構各種CPU,常見的IO設備以及定制化BIOS的模擬,支持對早期的386處理器到最新的x86-64架構Intel和AMD處理器,甚至包含未上市的處理器版本,1
上面特別強調了模擬器,這和我們平時使用的VMware或是Virtual Box這類虛擬機有何不同呢?雖然表面上看起來,都是在一臺宿主機上運行一個客戶機系統,但它們兩個的運行原理和適用場景卻有著天差地別,
- 虛擬機:指采用虛擬化技術,在已有主機的硬體設施的基礎上,虛擬出的一套獨立的硬體設施,從原理上看,簡單來說(不太嚴謹),虛擬機中的計算機指令仍然是交由宿主機中的物理核心執行的,因此,它的執行速度相對較快,適用于在物理機上運行一套完整作業系統并使用的場景,
- 模擬器:指使用軟體模擬出各個計算機硬體及其功能,包括CPU、內設、外接設備、BIOS等,其底層執行完全是由軟體模擬的,因此相較虛擬機而言,模擬器的運行速度慢得多,但由于其作業系統的指令并沒有真正讓物理機的核心執行,其安全性與崩潰后整個系統的穩定性也好得多,常見于作業系統開發,
所以,將要手動撰寫作業系統的我們,自然也采用Bochs作為運行/除錯我們作業系統的工具,
安裝
我們的環境搭建在VMware Workstation中創建的Ubuntu 16.04LTS虛擬機里,(比較繞XD)當然,Bochs支持Windows和Mac OS平臺,如果沒有或沒有興趣配置虛擬機的話,讀者可以裝在自己喜歡的平臺上,
在Ubuntu上,安裝有apt支持的軟體真是一件十分令人享受的事情,
sudo apt install bochs-x
一行命令即可結束戰斗,接下來就可以愉快的玩耍啦!(我們安裝的是帶有x11圖形化插件的版本,它會自動安裝主程式,如果你的計算機沒有安裝x11,在接下來的運行程序中可能會報錯,安裝一下即可)
默認的軟體安裝位置在/usr/share/bochs下,所有軟體的可執行檔案都在其中,系統還為我們配置好了“快捷方式”,直接輸入命令bochs,就能啟動Bochs模擬器,


啟動后會出現一個選單,默認選項為2,也就是我們后面要講的內容:從組態檔讀取模擬機器的配置,
組態檔
類似于VMware中虛擬機的組態檔,需要Bochs模擬的機器(下面我也稱為虛擬機)的各項硬體配置也需要一個組態檔指定,只不過VMWare有一個比較方便的圖形化界面而已,
系統給出的樣例檔案位于/usr/share/doc/bochs/examples/bochsrc,為一個文本檔案,里面有非常詳盡的注釋,可以幫助我們理解各個選項,以及對應值的含義,讀者如果有興趣可以自己研究,
我們也可以使用如下的簡化版bochsrc(注意其中路徑可能需要修改,以安裝路徑為準)
# Bochs組態檔
# 配置機器記憶體,建議使用新的Memory選項
memory: guest=32, host=64
# 總占用64MB宿主機記憶體,分配給虛擬機32MB
# 對應真實機器的bios (使用bochs提供的BIOS)
romimage: file=/usr/share/bochs/BIOS-bochs-latest
# 對應真實機器的VGA bios
vgaromimage: file=/usr/share/bochs/VGABIOS-lgpl-latest
# 啟動方式
boot: disk
# 關倍訓鼠
mouse: enabled=0
# 設定鍵盤映射
keyboard: keymap=/usr/share/bochs/keymaps/x11-pc-us.map
# 硬碟設定
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
我們將其命名為bochsrc.disk,表明從硬碟啟動作業系統,
**與VMware相同,Bochs同樣不要求虛擬機和Bochs軟體在同一目錄下,這會增加操作的復雜度,**我們可以在任何位置(如家目錄等)放置我們的虛擬機組態檔以及其他內容,
需要注意的是,Bochs同樣擁有作業目錄,也就是我們打開的bochsrc的位置,最好將一個虛擬機的所有檔案歸入一個目錄中,這樣可以在組態檔里方便地使用相對路徑,也可以避免不必要的檔案混淆,
啟動Bochs
第一次
Bochs有足夠的安全性,即使系統執行失敗了,一般也不會對宿主機產生什么影響,所以,如果你已經迫不及待了的話,那就試試吧!
- 切換到bochsrc,也就是你的虛擬機所在的目錄
- 輸入
bochs命令啟動Bochs - 在上面說過的主選單上,選擇默認選項2(也可以不輸入,就是默認)
- 它將提示你輸入一組態檔名稱,輸入我們剛剛配置好的
bochsrc.disk - 視窗猛烈輸出調式資訊,停在了
<bochs:1>處,這就是虛擬機除錯的命令列,接下來彈出了一個黑框,也就是我們的虛擬機視窗
此時,虛擬機處于除錯狀態,類似于程式準備執行入口指令,但被入口斷點截停了
我們需要在命令列中輸入c(continue,繼續運行),讓我們的”作業系統“開始運行,這里是不是有點像gdb除錯呢?(其實我們也可以使用gdb除錯,但其自帶的除錯個人感覺更好)
我們的空”作業系統”繼續執行,剛才彈出的黑框視窗有了邊上的基本UI,然后不出意料地,我們遇到了一個錯誤,

來自BIOS的一個錯誤,沒有可啟動的設備,這是當然,我們甚至沒有為虛擬機配置一個硬碟!XD
點擊Quit退出,如果你不慎關閉了視窗還沒有結束除錯命令列,則輸入q退出除錯,
生成硬碟
上面的錯誤讓我們配置一塊硬碟,我們可以用Bochs自帶的bximage工具生成一塊虛擬硬碟,
這個工具擁有與Bochs相同的的互動界面,可以直接打開,并按照步驟操作,也可以使用靜默命令列一行搞定,
bximage -hd -mode="flat" -size=10 -q disk.img
上面命令的引數含義如下:
- hd: 生成一塊硬碟(fd為floppy disk,軟盤)
- mode: 硬碟模式,這里使用flat平坦模式,詳見bochsrc樣例
- size: 硬碟大小,單位MB
- -q: 重要,靜默生成磁盤,而不是使用互動模式詢問
- disk.img: 想要生成的磁盤映像檔案名
執行完成后,在當前目錄下,生成了一個磁盤,

工具還貼心地為你生成了一個配置陳述句,幫助你直接寫入bochsrc組態檔中,我們把這條陳述句復制進去,
ata0-master: type=disk, path="disk.img", mode=flat, cylinders=20, heads=16, spt=63
這樣就相當于將一塊硬碟裝入了我們的虛擬機中,
再次啟動
再次啟動,我們可以使用更方便的方法,
-
使用命令列引數直接指定我們的組態檔
bochs -f bochsrc.disk -
將組態檔改名為默認的
bochsrc,后啟動Bochs直接載入默認組態檔
然而,啟動遇到了同樣的錯誤,這也是顯然的,雖然我們生成了一塊硬碟,但我們沒有向其中寫入任何資料,BIOS并沒有在里面找到主引導記錄,也就不會啟動系統,系統到這里就終止了,
關于引導的撰寫,我們將在下面的章節中一起學習,
參考書目:《作業系統真象還原》
翻自Bochs官網 ??
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/413331.html
標籤:其他
上一篇:匯編語言第一周學習
