1、安裝和配置bochs
首先從bochs.sourceforge.net里面把BOCHS給download下來,鑒于Windows的普及,僅僅談BOCHS在win下的使用方法,其實(shí)在其它的OS中方法差不多,不過我僅僅在Window和Linux下安裝使用過。
在bochs.sourceforge.net里面把Bochs-2.6.1.exe給download下來,雙擊就開始安裝。這軟件不大,安裝完才4兆多,當(dāng)然,這是標(biāo)準(zhǔn)安裝,如果你選擇的是完全安裝,則比標(biāo)準(zhǔn)安裝多個(gè)DLX linux demo這個(gè)OS,如果你是第一次使用BOCHS,建議你用完全安裝,裝完 ,現(xiàn)不用著急學(xué)會(huì)BOCHS的一大堆配置,可以先用用它自帶的這個(gè)OS,感受下BOCHS。
在BOCHS的目錄里面有個(gè)dlxlinux子目錄,進(jìn)去,雙擊bochsrc,就進(jìn)入下圖:
這dlx linux是系統(tǒng)自帶的,如果自己想用別的操作系統(tǒng)該怎么辦呢?嘿嘿,別著急,BOCHS的開發(fā)者們已經(jīng)為我們考慮好了,bochs.sourceforge.net里面,你能找到很多img文件,這些都是開發(fā)者們做好的鏡像文件了,嗯,說白了,就等于是機(jī)子的硬盤了,咱們僅僅需要的就是配置好,能運(yùn)行就可以。
通常我喜歡的方法是改配置文件,這方法似乎也是BOCHS的使用者們通常喜歡采用的吧,我詳細(xì)介紹這方法。
比方說,咱們想用msdos這個(gè)操作系統(tǒng),從網(wǎng)上找個(gè)msdos的啟動(dòng)盤的鏡像文件,如果找不到的話,可以自己做個(gè),方法:首先做個(gè)啟動(dòng)盤鏡像文件,取名boot.img這就做好了,方法可以參考我以前寫的”用vmware運(yùn)行簡(jiǎn)單的引導(dǎo)代碼“或者也可以用dos下的hd-copy這個(gè)工具做出來。然后單獨(dú)建立個(gè)目錄(隨意地方)msdos,然后把bochs安裝目錄里面的bochsrc-sample.txt這個(gè)文件復(fù)制到msdos這個(gè)目錄里面,并改名,注意,后綴最好是bxrc,這個(gè)后綴是bochs可以識(shí)別的。bochsrc-sample.txt這個(gè)文件是配置文件模板,我們就是在這個(gè)模板的基礎(chǔ)上修改參數(shù)成為我們的操作系統(tǒng)所使用的配置文件。
第一個(gè)參數(shù):floppya這是A驅(qū)動(dòng)器的參數(shù),當(dāng)然,自然也是模擬的。通常所用的軟驅(qū)是1.44MB的,因此后面跟的參數(shù)是1_44=/dev/fd0 注意,這個(gè)/dev/fd0必須是你的軟驅(qū)的鏡像,比方說咱們的msdos就是boot.img,你把/dev/fd0改成1_44=boot.img就可以。當(dāng)然,也可以模擬其它的軟驅(qū),如2。88M,720K,360K的,這非常的有用!后面的參數(shù)status標(biāo)明軟驅(qū)的狀態(tài),只能有兩個(gè)inserted(軟盤插入軟驅(qū)),ejected(軟盤未插入軟驅(qū))。
第二個(gè)參數(shù):boot,這是啟動(dòng)的驅(qū)動(dòng)器,它的頻率也比較高。它可以帶的參數(shù)有floppy(軟驅(qū)啟動(dòng)),disk(磁盤啟動(dòng)),cdrom(光驅(qū)啟動(dòng))。
這兩個(gè)參數(shù)是最最常用的,幾乎是必用吧。
第三個(gè)參數(shù):ata0,ata1,ata2,ata3,這應(yīng)該算是四個(gè)參數(shù)吧,沒事別改它,反正我是沒改過它,還常常吧后面的ata1,ata2,ata3給注釋掉,僅僅留ata0。
第四個(gè)參數(shù):ATA[0-3]-MASTER,ATA[0-3]-SLAVE,這就有用了,指定硬盤或光盤的參數(shù),并指明它是主盤還是從盤。標(biāo)準(zhǔn)的參數(shù)是ata0-master: type=disk, mode=flat, path="30M.sample", cylinders=615, heads=6, spt=17,type參數(shù)只能是兩者,disk(硬盤),cdrom(光盤),mode這個(gè)參數(shù)鏡像類型,它僅僅是針對(duì)磁盤才有效,有幾種,flat(一個(gè)文件的布局)concat(多個(gè)文件的布局)external(開發(fā)者指定的,通過C++的類BOCHS就是C++開發(fā)的)dll(開發(fā)者指定的,通過dll文件)vmware3(wmware3使用的硬盤鏡像)。還有幾個(gè)其它的不介紹;path是指定硬盤或是光盤鏡像的文件。Cylinders,Heads,Spt這幾個(gè)參數(shù)通過這名字就能知道了。
知道這3個(gè)參數(shù)(除了第三個(gè)),基本上就能應(yīng)付大多數(shù)的了。
下面安裝模板中的參數(shù)的位置,一個(gè)一個(gè)參數(shù)介紹,由于不常用,僅僅介紹下,不會(huì)象前面納幾個(gè)參數(shù)那樣詳細(xì)介紹,除非我覺得特別有用,或是使用過程中用過了。
config_interface:關(guān)于配置文件的接口,嗯,其實(shí)就是在BOCHS運(yùn)行過程中改變配置的界面。
display_library:圖形庫(kù)。
Romimage:ROM BIOS
Megs:內(nèi)存
optromimage [1-4]:ROM鏡像的選項(xiàng)
vgaromimage:VGA ROM BIOS
floppya:軟驅(qū)A
floppyb:軟驅(qū)B
ata[0-3]:硬盤或光驅(qū)的ata控制器
ATA[0-3]-MASTER, ATA[0-3]-SLAVE:ata設(shè)備的類型
Boot:?jiǎn)?dòng)驅(qū)動(dòng)器
Ips:模擬的頻率,有些時(shí)候特別有用,比如我裝minix1.5的時(shí)候,在login的時(shí)候,如果機(jī)子高檔的話,輸入passwd的時(shí)間特別短,這時(shí)候就需要調(diào)整頻率了。當(dāng)然,聽說軟件如果對(duì)實(shí)時(shí)控制特別研的時(shí)候,也必須改它。
Clock:時(shí)鐘
floppy_bootsig_check:是否檢查軟盤引導(dǎo)時(shí)候的引導(dǎo)的標(biāo)記0xaa55
log:調(diào)試用的日志
logprefix:日志記錄的格式
panic:Bochs這個(gè)軟件本身錯(cuò)誤的信息,如配置文件出錯(cuò)或是模擬錯(cuò)誤如不支持圖形模式。
Error:Bochs遇到不能模擬的情況,如出現(xiàn)非法指令。
Info:一些不常出現(xiàn)的情況。
Debug:主要用來開發(fā)Bochs這個(gè)軟件時(shí)報(bào)告情況用的。
以上四個(gè)參數(shù)(panic,error,info,debug)是Bochs運(yùn)行時(shí)遇到的不同等級(jí)的情況。
debugger_log:調(diào)試器輸出錯(cuò)誤的文件。
com1:串行端口。
parport1:并行端口。
sb16:聲卡。
vga_update_interval:VGA卡刷新率。
ne2k:網(wǎng)卡。
2、用bochs運(yùn)行引導(dǎo)代碼
通過前面參數(shù)的介紹,我們來配置和運(yùn)行自己寫的系統(tǒng)引導(dǎo)代碼,并且通過前面的介紹我們已經(jīng)建立了一個(gè)叫msdos的文件夾,里面包含配置文件和軟盤鏡像文件。
首先是設(shè)置floppya參數(shù)指向自己制作的包含引導(dǎo)代碼的軟盤鏡像boot.img,具體配置如下:
floppya: 1_44=boot.img, status=inserted然后是boot參數(shù)的設(shè)置,我們直接用軟盤引導(dǎo),具體配置如下:
boot: floppy其它參數(shù)都用默認(rèn)就好,然后直接雙擊bochsrc-sample.bxrc文件就可以運(yùn)行了,如下圖所示:
可以看出引導(dǎo)代碼的輸出語(yǔ)句”load root directory“,表明運(yùn)行成功!!
3、用bochs調(diào)試代碼
直接在bochs的安裝目錄中雙擊bochsdbg文件,然后選擇加裝前面我們的配置文件bochsrc-sample.bxrc,點(diǎn)開始就進(jìn)入調(diào)試模式了,如下圖所示:
此時(shí)是暫停在BIOS中。而我們的代碼是從0x7C00位置開始的,所以先要在那里設(shè)一個(gè)斷點(diǎn),然后繼續(xù)運(yùn)行到斷點(diǎn):
接下來可以用命令help來查看調(diào)試系統(tǒng)的各種基本命令,這里給出了一些常用的命令
3.1 執(zhí)行控制指令
c/cont/continue | 連續(xù)執(zhí)行 |
s/step/stepi [count] | 執(zhí)行count條指令,默認(rèn)為1條,會(huì)跟進(jìn)到函數(shù)和中斷調(diào)用的內(nèi)部 |
p/n/next [count] | 執(zhí)行count條指令,默認(rèn)為1條,但跳過函數(shù)和中斷調(diào)用 |
Ctrl+C | 停止執(zhí)行,并回到命令行提示符下 |
q/quit/exit | 退出調(diào)試和執(zhí)行 |
3.2 斷點(diǎn)設(shè)置命令
vb/vbreak seg:offset | 在虛擬地址上設(shè)置指令斷點(diǎn),其中seg和offset可以是以0x開始的十六進(jìn)制數(shù),或十進(jìn)制,或者是以0開頭的八進(jìn)制數(shù) |
lb/lbreak addr | 在線性地址上設(shè)置斷點(diǎn),addr同上面的seg和offset |
b/break/pb/pbreak addr | 在物理地址上設(shè)置斷點(diǎn) |
info break | 顯示當(dāng)前所有斷點(diǎn)的信息 |
d/del/delete n | 刪除一個(gè)斷點(diǎn) |
3.3 內(nèi)存操作指令
x /nuf addr | 檢查位于線性地址addr處的內(nèi)存內(nèi)容 |
xp /nuf addr | 檢查位于物理地址addr處的內(nèi)存內(nèi)容 |
其中參數(shù)n、u、f分別表示:
n為要顯示內(nèi)存單元的計(jì)數(shù)值,默認(rèn)為1
u表示單元大小,默認(rèn)值為w
b(bytes) 1字節(jié) h(halfwords) 2字節(jié) w(words) 4字節(jié) g(giantwords) 8字節(jié) f為顯示格式,默認(rèn)為x x(hex) 顯示為十六進(jìn)制數(shù) d(decimal) 顯示為十進(jìn)制數(shù) u(unsigned) 顯示為無(wú)符號(hào)十進(jìn)制數(shù) o(octal) 顯示為八進(jìn)制數(shù) t(binary) 顯示為二進(jìn)制數(shù) c(char) 顯示為對(duì)應(yīng)的字符3.4 信息顯示和CPU寄存器操作命令
r/reg/regs/registers | 列表顯示CPU寄存器及其內(nèi)容 |
set $reg=val | 修改某寄存器的內(nèi)容。除段寄存器和標(biāo)志寄存器以外的寄存器都可以修改,如set $eax=0x01234567 |
creg | 列出所有的CR0-CR4寄存器 |
sreg | 列出CPU全部狀態(tài)信息,包括各個(gè)段選擇子(cs,ds等)以及l(fā)dtr和gdtr等。 |
print-stack | 打印堆棧情況。 |
info tab | 顯示頁(yè)表 |
3.5 反匯編命令
u/disasm/disassemble start end,反匯編給定線性地址范圍的指令。也可以是u /10 反匯編從當(dāng)前地址開始的10條指令。如下圖
總結(jié):
bochs的調(diào)試感覺和gdb對(duì)匯編的調(diào)試很類似,所以用起來挺方便的,而且對(duì)于開發(fā)操作系統(tǒng)的人來說,bochs的調(diào)試功能無(wú)疑是很強(qiáng)大的,可以直接看到cup的執(zhí)行情況,以及各個(gè)寄存器和內(nèi)存單元的內(nèi)容,這對(duì)于調(diào)試程序、掌握程序的運(yùn)行情況是很有幫助的。