Bochs是由Kevin Lawton 于1994年開始開發(fā)的一個用于完全模擬Intel的x86模擬器,。開始它僅僅是一個商業(yè)產(chǎn)品,不過您可以購買到它的源程序,。在2000年3月這個時刻,,Mandrakesoft買下了Bochs,并把它置于GNU LGPL下使之成為一個開源程序,。在2001年3月,,Kevin把Bochs的家從bochs.com移到了bochs.sourceforge.net,到現(xiàn)在為止,,Bochs已經(jīng)習慣了它的新家,。
Bochs是用C++開發(fā)的,它被設(shè)計成可以運行于多種主流平臺下,,包括x86, PPC, Alpha, Sun和MIPS,。它完全是靠軟件模擬來實現(xiàn)的。從啟動到重啟,,包括PC的外設(shè)鍵盤,,鼠標,VGA卡,,磁盤,,網(wǎng)卡等,全部都是有軟件來模擬的,。這和其它的模擬器如VMware,,plex86等有很大的區(qū)別。也正是由于Bochs完全是靠軟件來模擬整個PC環(huán)境,因此它非常的適合開發(fā)操作系統(tǒng),,這對廣大操作系統(tǒng)愛好者來說是一個福音,。因為有它,使得調(diào)試操作系統(tǒng)非常非常的容易,,它自帶一個調(diào)試器bochsdbg,,它可以從PC機剛啟動的那一剎那起就開始模擬,注意,,這不是從讀取磁盤中的引導(dǎo)扇區(qū)那開始模擬,。后面我會提到如何使用它來調(diào)試。 鑒于Bochs對操作系統(tǒng)設(shè)計的巨大作用,,《操作系統(tǒng):設(shè)計與實現(xiàn)》這一偉大的操作系統(tǒng)書籍所帶的光盤中就有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,建議你用完全安裝,,裝完 ,,現(xiàn)不用著急學會BOCHS的一大堆配置,可以先用用它自帶的這個OS,,感受下BOCHS,。 在BOCHS的目錄里面有個dlxlinux子目錄,進去,,雙擊bochsrc,,就進入圖1。
圖1
這就等于機子里面已經(jīng)安裝了dlx linux這個操作系統(tǒng),,你現(xiàn)在可以進去感受它了?。海?/p>
這dlx linux是系統(tǒng)自帶的,如果自己想用別的操作系統(tǒng)該怎么辦呢,?嘿嘿,,別著急,,BOCHS的開發(fā)者們已經(jīng)為我們考慮好了,bochs.sourceforge.net里面,,你能找到很多img文件,,這些都是開發(fā)者們做好的鏡像文件了,嗯,,說白了,,就等于是機子的硬盤了,咱們僅僅需要的就是配置好,,能運行就可以,。 通常我喜歡的方法是改配置文件,這方法似乎也是BOCHS的使用者們通常喜歡采用的吧,,我詳細介紹這方法,。 比方說,咱們想用msdos這個操作系統(tǒng),,從網(wǎng)上找個msdos的啟動盤的鏡像文件,,如果找不到的話,可以自己做個,,方法:首先做個啟動盤,,然后用dos下的hd-copy這個工具做出這個啟動盤的鏡像文件,取名msdos.img這就做好了,。單獨建立個目錄(隨意地方)msdos,,然后把bochs安裝目錄里面的bochsrc-sample.txt這個文件復(fù)制到msdos這個目錄里面,并改名,,注意,,后綴最好是bxrc,這個后綴是bochs可以識別的,。bochsrc-sample.txt這個文件是配置文件模板,,我們就是在這個模板的基礎(chǔ)上修改參數(shù)成為我們的操作系統(tǒng)所使用的配置文件。 先說最有用的幾個參數(shù),,這幾個參數(shù)是使用頻率最高的,,如果你同我一樣很忙以致沒有耐心看完整篇文章,你僅僅需要知道這幾個參數(shù)的用法,,就可以應(yīng)付大多數(shù)的了,。注意,#在這配置文件中是注釋標記,,表明后面#后面的全部是注釋的內(nèi)容,。 第一個參數(shù):floppya這是A驅(qū)動器的參數(shù),當然,自然也是模擬的,。通常所用的軟驅(qū)是1,。44MB的,因此后面跟的參數(shù)是1_44=/dev/fd0 注意,,這個/dev/fd0必須是你的軟驅(qū)的鏡像,,比方說咱們的msdos就是msdos.img,你把/dev/fd0改成1_44=msdos.img就可以,,當然,,也可以模擬其它的軟驅(qū),如2,。88M,,720K,360K的,,這非常的有用,!你裝minix1.5版的時候就知道了,網(wǎng)站上download的都是360K,,說明那是360K的磁盤,,你可以模擬除360K的軟驅(qū)使用。后面的參數(shù)status標明軟驅(qū)的狀態(tài),,只能有兩個inserted(軟盤插入軟驅(qū)),,ejected(軟盤未插入軟驅(qū))。完整的就是floppya: 1_44=msdos.img, status=inserted,,別的軟驅(qū)如B類似,。 第二個參數(shù):boot,這是啟動的驅(qū)動器,,它的頻率也比較高,。它可以帶的參數(shù)有floppy(軟驅(qū)啟動),disk(磁盤啟動),,cdrom(光驅(qū)啟動),。 這兩個參數(shù)是最最常用的,幾乎是必用吧,。嗯~~下面的參數(shù)是關(guān)于硬盤的,有些麻煩,,也算是比較常用吧,。 第三個參數(shù):ata0,ata1,,ata2,,ata3,這應(yīng)該算是四個參數(shù)吧,沒事別改它,,反正我是沒改過它,,還常常吧后面的ata1,ata2,,ata3給注釋掉,,僅僅留ata0。至于參數(shù)嗎,,你自己看看吧,,不常用,我后面說,。 第四個參數(shù):ATA[0-3]-MASTER,,ATA[0-3]-SLAVE,這就有用了,,指定硬盤或光盤的參數(shù),,并指明它是主盤還是從盤。標準的參數(shù)是ata0-master: type=disk, mode=flat, path="30M.sample", cylinders=615, heads=6, spt=17,,type參數(shù)只能是兩者,,disk(硬盤),cdrom(光盤),,mode這個參數(shù)鏡像類型,,它僅僅是針對磁盤才有效,有幾種,,flat(一個文件的布局)concat(多個文件的布局)external(開發(fā)者指定的,,通過C++的類BOCHS就是C++開發(fā)的)dll(開發(fā)者指定的,通過dll文件)vmware3(wmware3使用的硬盤鏡像),。還有幾個其它的不介紹,;path是指定硬盤或是光盤鏡像的文件。Cylinders,,Heads,,Spt這幾個參數(shù)通過這名字就能知道了。注意,,這通常來說也不算是太重要,,但是某些時候,則是特別重要,,比如以前我裝minix1.5的時候,,用bximage這個bochs自帶的創(chuàng)建磁盤工具創(chuàng)建了個硬盤,然后就指明路徑就運行,,結(jié)果分區(qū)的時候一直出錯,,查了半天才發(fā)現(xiàn)這幾個參數(shù)沒有設(shè)置好,,bximage創(chuàng)建的硬盤的Heads和Spt似乎是固定的,和模板自帶的不一樣,,結(jié)構(gòu)分區(qū)的時候,,自然按配置文件里的計算,和實際的自然不符,。 知道這3個參數(shù)(除了第三個),,基本上就能應(yīng)付大多數(shù)的了。 下面安裝模板中的參數(shù)的位置,,一個一個參數(shù)介紹,,由于不常用,僅僅介紹下,,不會象前面納幾個參數(shù)那樣詳細介紹,,除非我覺得特別有用,或是使用過程中用過了,。 config_interface:關(guān)于配置文件的接口,,嗯,其實就是在BOCHS運行過程中改變配置的界面,。 display_library:圖形庫,。 Romimage:ROM BIOS Megs:內(nèi)存 optromimage [1-4]:ROM鏡像的選項 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:啟動驅(qū)動器 Ips:模擬的頻率,有些時候特別有用,,比如我裝minix1.5的時候,,在login的時候,如果機子高檔的話,,輸入passwd的時間特別短,,這時候就需要調(diào)整頻率了。當然,,聽說軟件如果對實時控制特別研的時候,,也必須改它。 Clock:時鐘 floppy_bootsig_check:是否檢查軟盤引導(dǎo)時候的引導(dǎo)的標記0xaa55 log:調(diào)試用的日志 logprefix:日志記錄的格式 panic:Bochs這個軟件本身錯誤的信息,,如配置文件出錯或是模擬錯誤如不支持圖形模式,。 Error:Bochs遇到不能模擬的情況,如出現(xiàn)非法指令,。 Info:一些不常出現(xiàn)的情況,。 Debug:主要用來開發(fā)Bochs這個軟件時報告情況用的。 以上四個參數(shù)(panic,,error,,info,debug)是Bochs運行時遇到的不同等級的情況,。 debugger_log:調(diào)試器輸出錯誤的文件,。 com1:串行端口。 parport1:并行端口,。 sb16:聲卡,。 vga_update_interval:VGA卡刷新率。 ne2k:網(wǎng)卡,。 下面舉例子說明如何使用,,分兩種例子舉。第一個是操作系統(tǒng)是商業(yè)的操作系統(tǒng),,也就是說拿來就可以用的,,把這種操作系統(tǒng)安裝到bochs里面。第二種是自己開發(fā)操作系統(tǒng),。事實上,,兩種的本質(zhì)沒什么區(qū)別。 第一種:安裝msdos6.22操作系統(tǒng),。 我們用光盤鏡像來安裝,,技巧,如果文件比較多,,比較大,,就盡量搞到光盤鏡像中(ISO文件),然后用個引導(dǎo)盤啟動,,這個引導(dǎo)盤要能掛光驅(qū),。我們所用的引導(dǎo)盤就是前面提到的msdos.img這個。我的是用win98的引導(dǎo)盤做的,。假如光盤鏡像文件是msdos.iso,。我們先做個硬盤,用bximage這個工具創(chuàng)建硬盤,,創(chuàng)建的時候,,選擇你所用虛擬的硬盤的大小。然后把創(chuàng)建的鏡像(c.img)復(fù)制到msdos6這個目錄中,,把msdos.img和msdos.iso也復(fù)制到msdos6這個目錄中,,嗯,還有bochsrc-sample.txt也復(fù)制過去并改名字為filename.bxrc,,然后編輯這個配置文件,,主要是把光盤掛上,把軟盤和硬盤也掛上,,并且把啟動的取得器設(shè)定為a,,然后雙擊filename.bxrc則開始運行了,安裝正常的安裝msdos622的方法,,先用fdisk分區(qū),,然后format,,然后重新啟動(格式化完必須重新啟動),然后進入光驅(qū)安裝,。 第二種:安裝自己開發(fā)的操作系統(tǒng),。 其實通過上面的那個例子,你也應(yīng)該知道這個的安裝方法和在實際機器中的差不多,,僅僅需要把所用的文件配置好就可以,,這里提到它,僅僅是因為用這個模擬器的大多數(shù)人都是操作系統(tǒng)愛好者,,否則大可不用Bochs,,畢竟它是純軟件模擬,速度較慢,。需要注意的還是引導(dǎo)磁盤的問題,,這個通常用winimage這個軟件來做。然后把所需要安裝的文件掛到光盤鏡像中一次性搞定,,我曾經(jīng)就傻乎乎的把所需要的文件分卷壓縮,,然后用winimage做成磁盤,一個一個復(fù)制到硬盤上,,然后解壓縮后安裝,,累死了,嘿嘿,,希望大家吸取我的教訓(xùn),。
Bochs是開發(fā)操作系統(tǒng)的極品模擬器的另外一個原因是它帶有調(diào)試功能。這也是本文的另一個需要重點講解的地方,。Bochsdbg這個程序是調(diào)試模式,。在調(diào)試模式中,我不會象前面的那樣直接雙擊配置文件就進入調(diào)試模式的法子,。我用的是笨法子,。在Bochs目錄里面把配置文件配好,注意,,關(guān)于光驅(qū),,軟驅(qū),硬盤的路徑一定要指定正確,。然后雙擊Bochsdbg.exe,, 進入圖2顯示界面
選擇2后,選擇配置文件的路徑和配置文件的文件名,,然后選擇5就開始運行了,。事實上,由于Bochs2.1.1默認的配置文件名是bochsrc.txt,,在Bochs目錄中,,如果你的配置文件的文件名就是這,,直接運行Bochsdbg就出現(xiàn)上面的畫面,再直接回車就可以了,。當然,,此種方法也可以運行Bochs,不是調(diào)試模式的,。 當然,你也可以學dlxlinux的方法,,把run.bat文件種的bochs改成bochsdbg就可以,。方法類似。 下面則進入如何調(diào)試了,。敲入help,,可以列出各個命令的用法。下面主要調(diào)試命令的用法,。 下面分類進行討論,。 控制執(zhí)行類: c 繼續(xù)執(zhí)行 stepi [count] 執(zhí)行count條指令,默認count為1 step [count] 執(zhí)行count條指令,,默認count為1 s [count] 執(zhí)行count條指令,,默認count為1 Ctrl-C 停止執(zhí)行, 并返回命令行 quit 退出調(diào)試 q 退出調(diào)試
斷點類: 注意:這里面的’seg’和’addr’所用的數(shù)的格式和c語言中的一致,例如 十六進制:0xcdef0123 八進制 :01234567 十進制 :12345678
vbreak seg:off 設(shè)置指令的虛擬地址的斷點位置,。 vb seg:off
lbreak addr 設(shè)置指令的線性地址的斷點位置,。 lb addr
pbreak addr 設(shè)置指令的物理地址的斷點位置。
pb addr (’*’這個選項是為GDB兼容設(shè)置的)
break addr
b addr
info break 顯示現(xiàn)在所有的斷點的狀態(tài) delete n 刪除第n個斷點 del n 同上 d n 同上
操作內(nèi)存類: x /nuf addr 查看線性地址的內(nèi)存 xp /nuf addr 查看物理地址的內(nèi)存 n 顯示多少個字節(jié)的內(nèi)存 u 單位長度; one o單位f b 字節(jié) h 半字(2 字節(jié)) w 字 (4 字節(jié)) g 雙字 (8 字節(jié)) 注意:這些并不是Intel中的術(shù)語,,但是它們和GDB的是一致的,。 F 打印格式: x 打印十六進制 d 打印十進制 u 打印無符號十進制 o 打印八進制 t 打印二進制 n, f, 和u都是可選參數(shù)。U和f默認的是你最后一次用的值,,如果沒有用過的話,,就是w(word)和x(hex)。N默認的是1,。addr也是可選參數(shù),。如果你沒有知道他的話,它將是下一條地址,。
setpmem addr datasize val 設(shè)置物理內(nèi)存某地址的內(nèi)容,。Addr是內(nèi)存地址,datasize地址長度,,val所想設(shè)置的值,。 crc addr1 addr2 顯示物理內(nèi)存addr1到addr2之間的CRC
Info 命令 info program 程序的執(zhí)行狀態(tài) info registers 顯示寄存器內(nèi)容 info break 顯示斷點狀態(tài)
操作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 設(shè)置CPU的狀態(tài) “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 告訴調(diào)試器,,反匯編段的屬性(16位或32位,,默認32位)。
相信到這里,,大家也基本會用BOCHS這個模擬器了,。本文的重點主要在前面的Bochs的使用方面。后面的調(diào)試部分,,僅僅列個表,,大家用的時候,參考下每個命令的用法,,也就差不多會調(diào)試了,。關(guān)于更具體的,大家可以參考bochs的文檔,,里面有更詳細的介紹,。
轉(zhuǎn)自:http://blog.csdn.net/yxin1322/archive/2006/04/14/664077.aspx
|
|