Bochs使用簡單教程

Bochs是一個開源的虛擬機。它可以實現vpc和vmware的大部分功能。你也可以像使用vmware一樣的在Bochs裏面安裝操作系統。但是,由 於它是全模擬的。所以,速度要遠遠慢於vmware.這樣看來Bochs好像沒有什麼優勢.是這樣嗎?在應用方面的確如此。

但是,在其他一個方面它是處於絕對優勢的。那就是它具有調試功能!這是一個讓人振奮的功能。這個功能在你調試操作系統或者其他一些在裸機上運行的 程序時候,會讓你有一種在寫windows下運行的應用程序的感覺。有時候它是我們的救命稻草。沒了它,也能活,但是肯定要糟糕的多。好了我們開始切入正 題。

一、 配置Bochs
實際上配置Bochs是很簡單的,爲什麼很多人不會配置呢?我覺的就是因爲他使用和配置方式和普通程序不一樣——配置文件。實際上配置文件是和 ini文件、bat文件類似的。Bochs沒有給我們提供圖形界面的配置工具。這就需要我們自己來修改配置文件。

簡單的配置就可以讓你的操作系統在Bochs裏面跑起來。用Bochs跑完整的linux和windows是不現實的。實在是太慢了。一般我們也 只能把他當成調試器來使用。現在,我們先看一下如何讓dos在他裏面跑起來。如果你細心的話你會發現在Bochs文件夾裏面有一個Bochsrc- sample.txt的文本文件。裏面包含了所有了Bochs參數的信息。這個是官方的教程。可惜是英文的,而且我也沒有找到有中文的教程(不然也沒有我 這篇文章)。在這裏我們僅僅介紹最簡單的配置選項。好了,廢話就不多說了。我們現在就開始。
我們以一個例子來說明,這個例子是我用來跑dos以及我自己的小操作系統的。下面就是我們要用到的最基本的選項:
# 在一行的最前面加上“#”表示這一行是註釋行。
# 內存,以MB爲單位,對於dos來說最大可以訪問16MB
# 的內存,所以我就給了他16MB,你可以根據自己的機器來調整
megs: 16
# 下面兩句一般是不可以改的,至於幹什麼用的就不用我說
# 了。從他們的文件名就可以看出來。
romp_w_picpath: file=../BIOS-Bochs-latest, address=0xf0000
vgaromp_w_picpath: file=../VGABIOS-lgpl-latest
# 這個還用說嗎?當然是軟驅了,我想我們寫操作系統肯定是先
# 把操作系統放在軟盤(或映像)裏面吧?在Bochs裏面是可
# 以使用任意大小的軟驅映像的。可以是1.44或2.88,我一般使
# 用2.88。還有就是Bochs裏面可以使用兩個軟驅。不過好像
# 我們並不經常這樣做。
floppya: 2_88=test.img, status=inserted
#floppyb: 1_44=floppyb.img, status=inserted
# 下面是硬盤,很簡單,還有就是Bochs也是可以支持多個硬
# 盤的。那麼,硬盤文件是怎麼生成的呢?我們可以發現硬盤是
# img格式的。你注意沒有在Bochs文件夾裏有一個工具叫
# bxp_w_picpath.exe,我想你應該猜出來了。他就是用來生成這個硬盤
# 文件的工具。我在這兒還想說的是硬盤分三種格式的,最好選
#用growing類型。這種有一個好處就是節省硬盤空間,不過使用
#這種類型的硬盤還需要在下面加上mode = growing這個選項。
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path="dos.img", cylinders=306, heads=4, spt=17
# 下面這個就是光驅,沒什麼好說的。如果你想使用物理光驅,
# 只要讓path=E:(我們假設E盤是光驅)
ata0-slave: type=cdrom, path="dos.iso", status=inserted
# 這個是啓動設備,可以使用cdrom(光驅)、c(硬盤)或floppy(軟
# 驅)。
#boot: cdrom
boot: c
#boot: floppy
# 這一句可以不要,他只是指定用來保存日誌的文件。如果不指定的
# 話他就會輸出到命令控制檯上。
log: Bochsout.txt
# 這一句是設置在開機時是否激活鼠標,Bochs對於鼠標的控制不是# 很好。建議如果不是特別需要的話不要激活他。在運行期間也可以點窗口右上角的鼠標圖標來激活他。
mouse: enabled=0
以上這些設置就可以讓你的DOS或自己的小操作系統在Bochs裏面跑起來了。至於其他的一些高級支持,你可以查看Bochsrc- sample.txt裏面的說明。不要害怕他,其實很簡單。關鍵是拋棄恐懼。

二、 啓動Bochs
配置文件已經寫好了,硬盤文件等也都已經弄好了。那麼我們如何來啓動Bochs呢?很簡單,你右擊一下上面寫的那個配置文件(例如 myos.bxrc,注意:擴展名要是.bxrc。)選擇“運行”或雙擊即可。不過我一般都不這樣做,我一般是寫一個批處理文件。

很簡單,如下所示:
cd "d:\Bochs-2.2.1\dos"
..\Bochs.exe -q -f Bochsrc.bxrc
這樣做的好處就是無論這個啓動腳本放在哪兒都是可以使用的。那麼,我們如何進入調試狀態呢?下面我們就來討論這個問題。

三、 調試功能
新建一個批處理文件,寫入一下內容:
cd "d:\Bochs-2.2.1\dos"
..\Bochsdbg.exe -q -f Bochsrc.bxrc
運行這個批處理文件,你就可以進入調試狀態了。不過你會發現,程序卡住了。沒有想普通運行狀態一樣進入你的dos操作系統。爲什麼?因爲調試在等 待你的命令。你只有給他一個命令他纔會繼續。我們輸入“c”,然後回車。是不是dos已經可是運行了?

如果沒有運行說明你輸入的窗口不對,你不會把c輸入到那個沒有光標的窗口了吧?如果真是那樣我真是服了你了。真的!但是,dos運行起來了,如何 在返回調試狀態?很簡單,按ctrl+c。什麼你正在運行的程序被結束了?誰讓你在操作系統窗口中按了,我是說在調試窗口按。至於哪個是調試窗口,哪個是 操作系統窗口,我就不說了。如果你不知道你就乾脆別使用Bochs了,也不要寫什麼程序了,更不要開發什麼操作系統了。爲什麼?因爲你不可能成功。從這兒 就可以看出來。最好是找塊豆腐撞死,這樣你會很幸福的死去,不然你就會成爲教育後代的典範——看到了嗎XXX是怎麼死的,笨死的。呵呵!開個玩笑。你真要 不知道
千萬不要來找我,找我我也不告訴你。不好意思,我也不知道。那麼,在調試狀態下我們可以幹哪些事呢?你用過debug嗎?它能做的Bochs都能 做,它不能做的Bochs也可以做。下面就是一些常用的調試命令。

help

我最想告訴大家的是這個指令,因爲他可以告訴我們一切。古語說:“授之以魚,不若授之以漁”。我覺的很有道理。但是,有些人就是不想學這種一勞永 逸的方法。所以,我還要繼續寫下去。
輸入help,回車。你會得到以下信息:
help - show list of debugger commands
help 'command'- show short command description
-*- Debugger control -*-
help, q|quit|exit, set, instrument, show, trace-on, trace-off,
record, playback, load-symbols, slist
-*- Execution control -*-
c|cont, s|step|stepi, p|n|next, modebp
-*- Breakpoint management -*-
vb|vbreak, lb|lbreak, pb|pbreak|b|break, sb, sba, blist,
bpe, bpd, d|del|delete
-*- CPU and memory contents -*-
x, xp, u|disas|disassemble, r|reg|registers, setpmem, crc, info, dump_cpu,
set_cpu, ptime, print-stack, watch, unwatch, ?|calc
需不需要我翻譯一下前兩句?那好吧。
help - 現實調試命令列表
help '命令' - 顯示某條命令的詳細用法。
命令分爲哪些?很明顯,四類:調試控制,運行控制,斷點管理,CPU和內存控制。我不想在這兒一一介紹了。沒有必要,我只介紹一下最常用的就可以 了。
c:繼續,前面我們已經用過了。
s:單步執行。他還有一個擴展用法。
s n :執行n步。
b 0x7c00:在內存0x7c00處設置一個斷點.當程序執行到0x7c00處就自動進入到調試狀態.後面的這個數指的是內存的線性地址

。也可以使用10進制的數,但是好像沒有人會這樣做。
x /20 0x7c00: 以16進制的形式從內存的0x7c00開始顯示20個字的數據。這個是很常用的命令,但是需要注意的是他的顯示順序和16進制編輯器中的顯示順序有一點小 的區別。他的顯示是以字爲單位的,而且在字中是從低到高顯示的.不過也沒有什麼大不了的。你只要稍微注意一下就可以了。

dump_cpu:這個是我最長用的三個指令之一。他的功能是顯示現在的寄存器的狀態,詳細內容類似於:
eax:0x00000000, ebx:0x00000000, ecx:0x00000000, edx:0x00000683
ebp:0x00000000, esp:0x00000000, esi:0x00000000, edi:0x00000000
eip:0x0000fff0, eflags:0x00000002, inhibit_mask:0
cs:s=0xf000, dl=0x0000ffff, dh=0xff009bff, valid=1
ss:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
ds:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
es:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
fs:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
gs:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
ldtr:s=0x0000, dl=0x00000000, dh=0x00000000, valid=0
tr:s=0x0000, dl=0x00000000, dh=0x00000000, valid=0
gdtr:base=0x00000000, limit=0xffff
idtr:base=0x00000000, limit=0xffff
dr0:0x00000000, dr1:0x00000000, dr2:0x00000000
dr3:0x00000000, dr6:0xffff0ff0, dr7:0x00000400
cr0:0x00000010, cr1:0x00000000, cr2:0x00000000
cr3:0x00000000, cr4:0x00000000
u /20 0x7c00 :反彙編內存0x7c00處,反彙編的長度是20。你想不想知道dos的引導程序是什麼樣子的?執行一下這個命令就可以了。你還可以使用這樣的命令 u /20 cs:0x120a,至於什麼意思,我也不說了。

現在,我們已經介紹了6條命令了。夠了。對於日常應用已經完全夠用了。如果你想了解其他命令的用法只要執行一下help “命令名”就可以了(注意,命令上要帶有引號)。好了。現在已經把Bochs的基本功能介紹完了。你是不是感覺Bochs很簡單?對於簡單的應用來說,確 實如此。但是,想讓他支持一些高級功能就有點麻煩了。畢竟它是全模擬的虛擬機,所以在有些方面實現起來並不容易。但是,向網絡之類的功能還是可以支持的。 你只要看一下Bochsrc-sample.txt就知道了。我在這兒就不說了。我還要說的是Bochs不僅僅可以調試操作系統,還可以調試dos下的程 序。我們知道dos沒有多少好的調試器。那麼我們完全可以使用Bochs來調試。你知道在程序的開頭輸出一下程序的段地址和偏移地址,然後暫定一下,在虛 擬機裏面設置一下斷點就可以了。我一般都是在在程序裏面潛入一句彙編:
jmp $
這樣在程序死循環的時候在調試窗口按下ctrl+c就可以看到他的段地址和偏移地址了。然後,在去掉這一句,設置一下斷點,運行這個程序。是不是 在指定位置中斷了?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章