用bochs調試自己寫的系統引導代碼


1 安裝和配置bochs

  首先從bochs.sourceforge.net里面把BOCHS給download下來,鑒於Windows的普及,僅僅談BOCHS在win下的使用方法,其實在其它的OS中方法差不多,不過我僅僅在Window和Linux下安裝使用過。

  在bochs.sourceforge.net里面把Bochs-2.6.1.exe給download下來,雙擊就開始安裝。這軟件不大,安裝完才4兆多,當然,這是標准安裝,如果你選擇的是完全安裝,則比標准安裝多個DLX linux demo這個OS,如果你是第一次使用BOCHS,建議你用完全安裝,裝完 ,現不用着急學會BOCHS的一大堆配置,可以先用用它自帶的這個OS,感受下BOCHS。

       在BOCHS的目錄里面有個dlxlinux子目錄,進去,雙擊bochsrc,就進入下圖:

這dlx linux是系統自帶的,如果自己想用別的操作系統該怎么辦呢?嘿嘿,別着急,BOCHS的開發者們已經為我們考慮好了,bochs.sourceforge.net里面,你能找到很多img文件,這些都是開發者們做好的鏡像文件了,嗯,說白了,就等於是機子的硬盤了,咱們僅僅需要的就是配置好,能運行就可以。

  通常我喜歡的方法是改配置文件,這方法似乎也是BOCHS的使用者們通常喜歡采用的吧,我詳細介紹這方法。

  比方說,咱們想用msdos這個操作系統,從網上找個msdos的啟動盤的鏡像文件,如果找不到的話,可以自己做個,方法:首先做個啟動盤鏡像文件,取名boot.img這就做好了,方法可以參考我以前寫的”用vmware運行簡單的引導代碼“或者也可以用dos下的hd-copy這個工具做出來。然后單獨建立個目錄(隨意地方)msdos,然后把bochs安裝目錄里面的bochsrc-sample.txt這個文件復制到msdos這個目錄里面,並改名,注意,后綴最好是bxrc,這個后綴是bochs可以識別的。bochsrc-sample.txt這個文件是配置文件模板,我們就是在這個模板的基礎上修改參數成為我們的操作系統所使用的配置文件。

  第一個參數:floppya這是A驅動器的參數,當然,自然也是模擬的。通常所用的軟驅是1.44MB的,因此后面跟的參數是1_44=/dev/fd0 注意,這個/dev/fd0必須是你的軟驅的鏡像,比方說咱們的msdos就是boot.img,你把/dev/fd0改成1_44=boot.img就可以。當然,也可以模擬其它的軟驅,如2.88M,720K,360K的,這非常的有用!后面的參數status標明軟驅的狀態,只能有兩個inserted(軟盤插入軟驅),ejected(軟盤未插入軟驅)。

      第二個參數: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這幾個參數通過這名字就能知道了。

      知道這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:網卡。

2 用bochs運行引導代碼

  通過前面參數的介紹,我們來配置和運行自己寫的系統引導代碼,並且通過前面的介紹我們已經建立了一個叫msdos的文件夾,里面包含配置文件和軟盤鏡像文件。

  首先是設置floppya參數指向自己制作的包含引導代碼的軟盤鏡像boot.img,具體配置如下:

floppya: 1_44=boot.img, status=inserted

  然后是boot參數的設置,我們直接用軟盤引導,具體配置如下:

boot: floppy

  其它參數都用默認就好,然后直接雙擊bochsrc-sample.bxrc文件就可以運行了,如下圖所示:

  可以看出引導代碼的輸出語句”load root directory“,表明運行成功!!!

3 用bochs調試代碼

直接在bochs的安裝目錄中雙擊bochsdbg文件,然后選擇加裝前面我們的配置文件bochsrc-sample.bxrc,點開始就進入調試模式了,如下圖所示:

  此時是暫停在BIOS中。而我們的代碼是從0x7C00位置開始的,所以先要在那里設一個斷點,然后繼續運行到斷點:

  接下來可以用命令help來查看調試系統的各種基本命令,這里給出了一些常用的命令

3.1 執行控制指令

c/cont/continue
連續執行

s/step/stepi [count]
執行count條指令,默認為1條,會跟進到函數和中斷調用的內部

p/n/next [count]
執行count條指令,默認為1條,但跳過函數和中斷調用

Ctrl+C
停止執行,並回到命令行提示符下

q/quit/exit
退出調試和執行

3.2 斷點設置命令

vb/vbreak seg:offset
在虛擬地址上設置指令斷點,其中seg和offset可以是以0x開始的十六進制數,或十進制,或者是以0開頭的八進制數

lb/lbreak addr
在線性地址上設置斷點,addr同上面的seg和offset

b/break/pb/pbreak addr
在物理地址上設置斷點

info break
顯示當前所有斷點的信息

d/del/delete n
刪除一個斷點

3.3 內存操作指令

x /nuf addr
檢查位於線性地址addr處的內存內容

xp /nuf addr
檢查位於物理地址addr處的內存內容

其中參數n、u、f分別表示:

n為要顯示內存單元的計數值,默認為1

u表示單元大小,默認值為w

   b(bytes)		1字節
h(halfwords) 2字節
w(words) 4字節
g(giantwords) 8字節

f為顯示格式,默認為x
   x(hex)         顯示為十六進制數
d(decimal)   顯示為十進制數
u(unsigned) 顯示為無符號十進制數
o(octal) 顯示為八進制數
t(binary) 顯示為二進制數
c(char) 顯示為對應的字符

3.4 信息顯示和CPU寄存器操作命令

r/reg/regs/registers
列表顯示CPU寄存器及其內容

set $reg=val
修改某寄存器的內容。除段寄存器和標志寄存器以外的寄存器都可以修改,如set $eax=0x01234567

creg
列出所有的CR0-CR4寄存器

sreg
列出CPU全部狀態信息,包括各個段選擇子(cs,ds等)以及ldtr和gdtr等。

print-stack
打印堆棧情況。

info tab
顯示頁表

3.5 反匯編命令

  u/disasm/disassemble start end,反匯編給定線性地址范圍的指令。也可以是u /10 反匯編從當前地址開始的10條指令。如下圖

  總結:bochs的調試感覺和gdb對匯編的調試很類似,所以用起來挺方便的,而且對於開發操作系統的人來說,bochs的調試功能無疑是很強大的,可以直接看到cup的執行情況,以及各個寄存器和內存單元的內容,這對於調試程序、掌握程序的運行情況是很有幫助的。

  參考:https://cms.hit.edu.cn/mod/wiki/view.php?pageid=22
http://blog.csdn.net/yxin1322/article/details/664077


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM