如果你準備寫一個作業系統或者隻是體驗一下linux的開機流程,寫一個簡單的bootloader,你可能會需要一個軟體–Bochs, Bochs是一個開源軟體,是你唯一可選擇的調試器.開源意味着你不需要花錢購買就可以使用它. 它用軟體來模拟處理器取指令和執行指令的過程,以及整個計算機硬體.當它開始運作時,就直接模拟計算機的啟動過程.正是因為如此,它才有可能做一些調試工作.很重要的一點,它本身就是一個虛拟機,類似于Virtualbox.是以,它也很容易就讓你單步跟蹤硬碟的控制權,檢視寄存器的内容和狀态.
Bochs的安裝
官網下載下傳安裝包解壓即可,主要是配置檔案,我的核心研究者的好盆友huloves發給了我一份配置檔案
# 若隻有一個軟碟,則使用 floppya即可,若有多個,則為floppya,floppyb...
#floppya: 1_44=a.img, status=inserted
# 選擇啟動盤符
#boot: floopy #預設從軟碟啟動,現在很少有軟碟了
boot: disk
# 設定日志檔案的輸出
log: bochs.out
# 開啟或關閉某些功能
# 關閉滑鼠,并打開鍵盤,鍵盤的路徑不一定是這個,比如我的是/usr/share/bochs/keymaps/x11-pc-us.map
mouse: enabled=0
keyboard:keymap=/usr/local/share/bochs/keymaps/x11-pc-us.map
# 硬碟設定,你需要使用bximage建立一個硬碟,然後它會傳回ata0-master所需要的資訊,path你需要改成你的絕對路徑
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path="/home/huloves/bochs-2.6.11/hd60M.img", mode=flat, cylinders=121, heads=16, spt=63
ata0-slave: type=disk, path="/home/huloves/bochs-2.6.11/hd80M.img", mode=flat, cylinders=162, heads = 16, spt = 63
######################### 配置檔案結束 ###########################
建立硬碟結束,你需要将你的啟動引導Bootloader寫入你建立的硬碟中, if = 啟動引導檔案 of= 你剛建立的磁盤
dd if=boot.bin of=a.img bs=512count=1 conv=notrunc
你需要找的bochsrc所在位置,然後在指令行
bochs -f 配置檔案所在位置
,例如我的是這樣的
bochs -f /etc/bochs-init/bochsrc
啟動bochs虛拟機
就像一台真正的計算機一樣,Bochs的"處理器"加電後,要開始取指令執行指令.但,與真正的處理器不同的是,Bochs在執行它啟動之後的第一條指令之後,會停下來,等待你的調試指令.
1指的是實體記憶體位址
2指的是邏輯位址,即段寄存器CS和指令指針寄存器IP的内容,是以16進制顯示的,等效于0xf000:0xfff0
3指的是下一條要執行的指令的彙編代碼
3以注釋的形式指的是指令的機器碼部分
現代處理器在加電後,所有的高端的位址線都被強制為高電平,直到遇到并執行了第一個段間轉移指令,段間轉移指令是在兩個代碼段之間實施控制轉移,也就是同時改變段寄存器CS和指令指針寄存器IP的jmp指令,就像
jmp 0xf000:0xfff0
就是一個典型的例子.是以,當該指令執行後,處理器的實體位址就僅取決于CS和IP了.
接下來,介紹一些Bochs的調試指令
- s(step): 執行下一條指令
- b(break): 斷點調試指令
- c(continue): 處理器不間斷的持續執行指令,如果設定了斷點,在斷點出停下來
- r(register): 顯示通用寄存器的内容
- sreg(segment register): 顯示段寄存器的内容
- xp(eXamine memory): 顯示指定實體記憶體地質處的内容
- n:跳過同一次指令的多次重複執行
- u: 跳過條件轉移指令構造的特殊循環體
- info eflags:檢視标志寄存器的狀态位,大寫為1,小寫為0
- xp: 查詢從某個位址開始的N個位元組的記憶體
,例如:顯示實模式下的中斷向量表’xp /1024bx 0’xp /Nbx 實體位址