Bochs是用C++開發的,它被設計成可以運行於多種主流平臺下,包括x86, PPC, Alpha, Sun和MIPS。它完全是靠軟件模擬來實現的。從啓動到重啓,包括PC的外設鍵盤,鼠標,VGA卡,磁盤,網卡等,全部都是有軟件來模擬的。這和其它的模擬器如VMware,plex86等有很大的區別。也正是由於Bochs完全是靠軟件來模擬整個PC環境,因此它非常的適合開發操作系統,這對廣大操作系統愛好者來說是一個福音。因爲有它,使得調試操作系統非常非常的容易,它自帶一個調試器bochsdbg,它可以從PC機剛啓動的那一剎那起就開始模擬,注意,這不是從讀取磁盤中的引導扇區那開始模擬。後面我會提到如何使用它來調試。
鑑於Bochs對操作系統設計的巨大作用,《操作系統:設計與實現》這一偉大的操作系統書籍所帶的光盤中就有Bochs軟件。
下面談BOCHS的用法。首先從bochs.sourceforge.net裏面把BOCHS給Download下來,鑑於Windows的普及,僅僅談BOCHS在win下的使用方法,其實在其它的OS中方法差不多,不過我僅僅在Window和Linux下安裝使用過。
在bochs.sourceforge.net裏面把Bochs-2.1.1.exe給抓了下來,雙擊就開始安裝。這軟件不大,安裝完才3兆多,當然,這是標準安裝,如果你選擇的是完全安裝,則比標準安裝多個DLX linux demo這個OS,如果你是第一次使用BOCHS,建議你用完全安裝,裝完 ,現不用着急學會BOCHS的一大堆配置,可以先用用它自帶的這個OS,感受下BOCHS。
在BOCHS的目錄裏面有個dlxlinux子目錄,進去,雙擊bochsrc,就進入圖1。
圖1
這就等於機子裏面已經安裝了dlx linux這個操作系統,你現在可以進去感受它了!:)
這dlx linux是系統自帶的,如果自己想用別的操作系統該怎麼辦呢?嘿嘿,彆着急,BOCHS的開發者們已經爲我們考慮好了,bochs.sourceforge.net裏面,你能找到很多img文件,這些都是開發者們做好的鏡像文件了,嗯,說白了,就等於是機子的硬盤了,咱們僅僅需要的就是配置好,能運行就可以。
通常我喜歡的方法是改配置文件,這方法似乎也是BOCHS的使用者們通常喜歡採用的吧,我詳細介紹這方法。
比方說,咱們想用msdos這個操作系統,從網上找個msdos的啓動盤的鏡像文件,如果找不到的話,可以自己做個,方法:首先做個啓動盤,然後用dos下的hd-copy這個工具做出這個啓動盤的鏡像文件,取名msdos.img這就做好了。單獨建立個目錄(隨意地方)msdos,然後把bochs安裝目錄裏面的bochsrc-sample.txt這個文件複製到msdos這個目錄裏面,並改名,注意,後綴最好是bxrc,這個後綴是bochs可以識別的。bochsrc-sample.txt這個文件是配置文件模板,我們就是在這個模板的基礎上修改參數成爲我們的操作系統所使用的配置文件。
先說最有用的幾個參數,這幾個參數是使用頻率最高的,如果你同我一樣很忙以致沒有耐心看完整篇文章,你僅僅需要知道這幾個參數的用法,就可以應付大多數的了。注意,#在這配置文件中是註釋標記,表明後面#後面的全部是註釋的內容。
第一個參數:floppya這是A驅動器的參數,當然,自然也是模擬的。通常所用的軟驅是1。44MB的,因此後面跟的參數是1_44=/dev/fd0 注意,這個/dev/fd0必須是你的軟驅的鏡像,比方說咱們的msdos就是msdos.img,你把/dev/fd0改成1_44=msdos.img就可以,當然,也可以模擬其它的軟驅,如2。88M,720K,360K的,這非常的有用!你裝minix1.5版的時候就知道了,網站上download的都是360K,說明那是360K的磁盤,你可以模擬除360K的軟驅使用。後面的參數status標明軟驅的狀態,只能有兩個inserted(軟盤插入軟驅),ejected(軟盤未插入軟驅)。完整的就是floppya: 1_44=msdos.img, status=inserted,別的軟驅如B類似。
第二個參數:boot,這是啓動的驅動器,它的頻率也比較高。它可以帶的參數有floppy(軟驅啓動),disk(磁盤啓動),cdrom(光驅啓動)。
這兩個參數是最最常用的,幾乎是必用吧。嗯~~下面的參數是關於硬盤的,有些麻煩,也算是比較常用吧。
第三個參數:ata0,ata1,ata2,ata3,這應該算是四個參數吧,沒事別改它,反正我是沒改過它,還常常吧後面的ata1,ata2,ata3給註釋掉,僅僅留ata0。至於參數嗎,你自己看看吧,不常用,我後面說。
第四個參數:ATA[0-3]-MASTER,ATA[0-3]-SLAVE,這就有用了,指定硬盤或光盤的參數,並指明它是主盤還是從盤。標準的參數是ata0-master: type=disk, mode=flat, path="30M.sample", cylinders=615, heads=6, spt=17,type參數只能是兩者,disk(硬盤),cdrom(光盤),mode這個參數鏡像類型,它僅僅是針對磁盤纔有效,有幾種,flat(一個文件的佈局)concat(多個文件的佈局)external(開發者指定的,通過C++的類BOCHS就是C++開發的)dll(開發者指定的,通過dll文件)vmware3(wmware3使用的硬盤鏡像)。還有幾個其它的不介紹;path是指定硬盤或是光盤鏡像的文件。Cylinders,Heads,Spt這幾個參數通過這名字就能知道了。注意,這通常來說也不算是太重要,但是某些時候,則是特別重要,比如以前我裝minix1.5的時候,用bximage這個bochs自帶的創建磁盤工具創建了個硬盤,然後就指明路徑就運行,結果分區的時候一直出錯,查了半天才發現這幾個參數沒有設置好,bximage創建的硬盤的Heads和Spt似乎是固定的,和模板自帶的不一樣,結構分區的時候,自然按配置文件裏的計算,和實際的自然不符。
知道這3個參數(除了第三個),基本上就能應付大多數的了。
下面安裝模板中的參數的位置,一個一個參數介紹,由於不常用,僅僅介紹下,不會象前面納幾個參數那樣詳細介紹,除非我覺得特別有用,或是使用過程中用過了。
config_interface:關於配置文件的接口,嗯,其實就是在BOCHS運行過程中改變配置的界面。
display_library:圖形庫。
Romimage:ROM BIOS
Megs:內存
optromimage [1-4]:ROM鏡像的選項
vgaromimage:VGA ROM BIOS
floppya:軟驅A
floppyb:軟驅B
ata[0-3]:硬盤或光驅的ata控制器
ATA[0-3]-MASTER, ATA[0-3]-SLAVE:ata設備的類型
Boot:啓動驅動器
Ips:模擬的頻率,有些時候特別有用,比如我裝minix1.5的時候,在login的時候,如果機子高檔的話,輸入passwd的時間特別短,這時候就需要調整頻率了。當然,聽說軟件如果對實時控制特別研的時候,也必須改它。
Clock:時鐘
floppy_bootsig_check:是否檢查軟盤引導時候的引導的標記0xaa55
log:調試用的日誌
logprefix:日誌記錄的格式
panic:Bochs這個軟件本身錯誤的信息,如配置文件出錯或是模擬錯誤如不支持圖形模式。
Error:Bochs遇到不能模擬的情況,如出現非法指令。
Info:一些不常出現的情況。
Debug:主要用來開發Bochs這個軟件時報告情況用的。
以上四個參數(panic,error,info,debug)是Bochs運行時遇到的不同等級的情況。
debugger_log:調試器輸出錯誤的文件。
com1:串行端口。
parport1:並行端口。
sb16:聲卡。
vga_update_interval:VGA卡刷新率。
ne2k:網卡。
下面舉例子說明如何使用,分兩種例子舉。第一個是操作系統是商業的操作系統,也就是說拿來就可以用的,把這種操作系統安裝到bochs裏面。第二種是自己開發操作系統。事實上,兩種的本質沒什麼區別。
第一種:安裝msdos6.22操作系統。
我們用光盤鏡像來安裝,技巧,如果文件比較多,比較大,就儘量搞到光盤鏡像中(ISO文件),然後用個引導盤啓動,這個引導盤要能掛光驅。我們所用的引導盤就是前面提到的msdos.img這個。我的是用win98的引導盤做的。假如光盤鏡像文件是msdos.iso。我們先做個硬盤,用bximage這個工具創建硬盤,創建的時候,選擇你所用虛擬的硬盤的大小。然後把創建的鏡像(c.img)複製到msdos6這個目錄中,把msdos.img和msdos.iso也複製到msdos6這個目錄中,嗯,還有bochsrc-sample.txt也複製過去並改名字爲filename.bxrc,然後編輯這個配置文件,主要是把光盤掛上,把軟盤和硬盤也掛上,並且把啓動的取得器設定爲a,然後雙擊filename.bxrc則開始運行了,安裝正常的安裝msdos622的方法,先用fdisk分區,然後format,然後重新啓動(格式化完必須重新啓動),然後進入光驅安裝。
第二種:安裝自己開發的操作系統。
其實通過上面的那個例子,你也應該知道這個的安裝方法和在實際機器中的差不多,僅僅需要把所用的文件配置好就可以,這裏提到它,僅僅是因爲用這個模擬器的大多數人都是操作系統愛好者,否則大可不用Bochs,畢竟它是純軟件模擬,速度較慢。需要注意的還是引導磁盤的問題,這個通常用winimage這個軟件來做。然後把所需要安裝的文件掛到光盤鏡像中一次性搞定,我曾經就傻乎乎的把所需要的文件分卷壓縮,然後用winimage做成磁盤,一個一個複製到硬盤上,然後解壓縮後安裝,累死了,嘿嘿,希望大家吸取我的教訓。
Bochs是開發操作系統的極品模擬器的另外一個原因是它帶有調試功能。這也是本文的另一個需要重點講解的地方。Bochsdbg這個程序是調試模式。在調試模式中,我不會象前面的那樣直接雙擊配置文件就進入調試模式的法子。我用的是笨法子。在Bochs目錄裏面把配置文件配好,注意,關於光驅,軟驅,硬盤的路徑一定要指定正確。然後雙擊Bochsdbg.exe, 進入圖2顯示界面
選擇2後,選擇配置文件的路徑和配置文件的文件名,然後選擇5就開始運行了。事實上,由於Bochs2.1.1默認的配置文件名是bochsrc.txt,在Bochs目錄中,如果你的配置文件的文件名就是這,直接運行Bochsdbg就出現上面的畫面,再直接回車就可以了。當然,此種方法也可以運行Bochs,不是調試模式的。
當然,你也可以學dlxlinux的方法,把run.bat文件種的bochs改成bochsdbg就可以。方法類似。
下面則進入如何調試了。敲入help,可以列出各個命令的用法。下面主要調試命令的用法。
下面分類進行討論。
控制執行類:
c 繼續執行
stepi [count] 執行count條指令,默認count爲1
step [count] 執行count條指令,默認count爲1
s [count] 執行count條指令,默認count爲1
Ctrl-C 停止執行, 並返回命令行
quit 退出調試
q 退出調試
斷點類:
注意:這裏面的’seg’和’addr’所用的數的格式和c語言中的一致,例如
十六進制:0xcdef0123
八進制 :01234567
十進制 :12345678
vbreak seg:off 設置指令的虛擬地址的斷點位置。
vb seg:off
lbreak addr 設置指令的線性地址的斷點位置。
lb addr
pbreak
addr 設置指令的物理地址的斷點位置。pb
addr (’*’這個選項是爲GDB兼容設置的)break
addrb
addr
info break 顯示現在所有的斷點的狀態
delete n 刪除第n個斷點
del n 同上
d n 同上
操作內存類:
x /nuf addr 查看線性地址的內存
xp /nuf addr 查看物理地址的內存
n 顯示多少個字節的內存
u 單位長度; one o單位f
b 字節
h 半字(2 字節)
w 字 (4 字節)
g 雙字 (8 字節)
注意:這些並不是Intel中的術語,但是它們和GDB的是一致的。
F 打印格式:
x 打印十六進制
d 打印十進制
u 打印無符號十進制
o 打印八進制
t 打印二進制
n, f, 和u都是可選參數。U和f默認的是你最後一次用的值,如果沒有用過的話,就是w(word)和x(hex)。N默認的是1。addr也是可選參數。如果你沒有知道他的話,它將是下一條地址。
setpmem addr datasize val 設置物理內存某地址的內容。Addr是內存地址,datasize地址長度,val所想設置的值。
crc addr1 addr2 顯示物理內存addr1到addr2之間的CRC
Info 命令
info program 程序的執行狀態
info registers 顯示寄存器內容
info break 顯示斷點狀態
操作CPU寄存器set $reg = val 改變CPU寄存器的值爲val。寄存器可以爲eax,ecx,edx,ebx,esp,ebp,esi,edi。 不能爲eflages,cs,ss,ds,es,fs,gs。info registers 見Info部分dump_cpu 顯示完整的CPU信息。set_cpu 設置CPU的狀態 “dump_cpu”和“set_cpu”的格式: "eax:0x%x\n" "ebx:0x%x\n" "ecx:0x%x\n" "edx:0x%x\n" "ebp:0x%x\n" "esi:0x%x\n" "edi:0x%x\n" "esp:0x%x\n" "eflags:0x%x\n" "eip:0x%x\n" "cs:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n" "ss:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n" "ds:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n" "es:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n" "fs:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n" "gs:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n" "ldtr:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n" "tr:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n" "gdtr:base=0x%x, limit=0x%x\n" "idtr:base=0x%x, limit=0x%x\n" "dr0:0x%x\n" "dr1:0x%x\n" "dr2:0x%x\n" "dr3:0x%x\n" "dr4:0x%x\n" "dr5:0x%x\n" "dr6:0x%x\n" "dr7:0x%x\n" "tr3:0x%x\n" "tr4:0x%x\n" "tr5:0x%x\n" "tr6:0x%x\n" "tr7:0x%x\n" "cr0:0x%x\n" "cr1:0x%x\n" "cr2:0x%x\n" "cr3:0x%x\n" "cr4:0x%x\n" "inhibit_int:%u\n" "done\n"
反彙編命令:disassemble start end 反彙編的地址範圍
set $disassemble_size = n 告訴調試器,反彙編段的屬性(16位或32位,默認32位)。
相信到這裏,大家也基本會用BOCHS這個模擬器了。本文的重點主要在前面的Bochs的使用方面。後面的調試部分,僅僅列個表,大家用的時候,參考下每個命令的用法,也就差不多會調試了。關於更具體的,大家可以參考bochs的文檔,裏面有更詳細的介紹。
轉自:http://blog.csdn.net/yxin1322/archive/2006/04/14/664077.aspx