Bochs 除錯技術

2021-04-17 22:50:03 字數 3463 閱讀 2560

bochs 除錯技術

freos hobby os: frank wang / 中國核芯網

對於任何想嘗試寫自己的作業系統的朋友來說,我都要向你推薦bochs。這個模擬器最大的好處就是可以單步除錯。在沒了解它之間,我在寫freos幾乎是瞎子,進展十分緩慢,特別是在你沒有完成顯示器驅動之前,你可以想象,看不到任何出錯資訊,看不到暫存器狀態,這個時候你一定覺得bochs是你的福星。^_^

這裡主要是講述bochs的除錯命令,如何配置bochs,請參考bochsrc-sample.txt,寫乙個自己的bochsrc.txt。bochsrc-sample.txt的說明很詳細,相信應該沒有問題。這裡是乙個作者給freos所配置的例子,僅供參考。然後執行bochsdbg.exe(除錯模式)。注意:bochs.exe是執行模式,不能除錯的。除錯模式將出現下列命令列:

bochs:1>

下面初步說明一下每條指令的用法::

執行控制命令

c 繼續執行,遇到斷點將停止

stepi [count] 執行count條指令, 預設為1條

si [count] stepi的縮寫

step [count] 執行count條指令, 預設為1條

s [count] step的縮寫

ctrl-c 停止執行,返回命令列

ctrl-d 執行完所有命令後,退出

quit 退出偵錯程式

q quit縮寫

設定斷點

vbreak seg:off 在指定的虛擬位址(段+偏移)設定斷點,在保護模式下也可以使用

vb seg:off

lbreak addr 在乙個線性位址設定斷點

lb addr

pbreak

addr 在乙個實體地址設定斷點

pbaddr

break

addr

baddr

info break 顯示所有斷點狀態

例如:————————————–

num type disp enb address

1 pbreakpoint keep y 0×00007c00

表示在實體地址0×00007c00設定乙個斷點,該斷點目前有效

—————————————

delete n 刪除乙個斷點

del n

d n關於實體地址,線性位址和虛擬位址的區別,我只能憑我的理解簡單說說,可能不準確。實體地址在什麼時候都存在,但是在採用分頁技術和虛擬記憶體技術後,你很難確定實體地址在那裡,所以建議在實模式下採用實體地址和線性位址形式,這時候實體地址和線性位址其實是一致的。最常用的,比方說,計算機啟動後的位址是 0xfff0:0000,裝載bios,然後轉移到0×07c0:0000,所以總可以設定乙個物理斷點0×7c00,開始除錯你的 bootloader。

檢視記憶體

x /nuf addr 檢視乙個線性位址的記憶體

xp /nuf addr 檢視乙個實體地址的記憶體

n 顯示多少個單位的記憶體

u 記憶體單位大小,可以是

b 位元組

h 字(2個位元組)

w 雙字(4個位元組)

g 4字(8位元組)

注意: 它們不太符合intel位元組命名格式,但是遵守gdb約定。

f 列印格式,可以是

x 16進製制格式列印

d 10進製格式列印

u 無符號10進製格式列印

o 8進製格式列印

t 2進製格式列印

n,f,和u是可選引數。u和f預設為你最後使用的引數, 如果是第一次使用,u預設為w,f預設為x, n預設為1。如果沒有指定nuf,那麼/也可以不要。setpmem addr datasize val 設定實體地址addr,大小datasize的記憶體單元的值為val.

crc addr1 addr2 對實體地址範圍addr1到addr2進行crc校驗?(沒用過)info dirty 顯示寫過的頁?(沒用過)

info

info program 檢視程式的執行狀態

info registers 列舉cpu整型暫存器遺跡它們的內容

info break 顯示當前斷點資訊

where 列印當前call stack

暫存器操作

set $reg = val 改變暫存器的內容。可改變的暫存器有:

eax, ecx, edx, ebx, esp, ebp, esi, edi.

不可改變的暫存器有:

eflags, cs, ss, ds, es, fs, gs.

例如 set $eax = 0×01234567

set $edx = 25

info registers 顯示暫存器內容

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」

bochs除錯技術

bochs除錯技術 除錯模式將出現下列命令列 bochs 1 下面初步說明一下每條指令的用法 執行控制命令 c 繼續執行,遇到斷點將停止 stepi count 執行count條指令,預設為1條 si count stepi的縮寫 step count 執行count條指令,預設為1條 s coun...

bochs除錯入門

bochs除錯入門 安裝sudo apt get install vgabios bochs bochs x bximage 建立軟盤 bximage fd一直回車,將在當前目錄下會建立乙個預設大小為1.44m的軟盤名為a.img。dd if boot of a.img bs 512 count 1...

Bochs除錯指令

bochs就像一台真機一樣,處理器在加電之後,要開始取指令並執行指令。jmpf f000 e05b 轉移目標位置rom bios如圖在左側顯示了該指令所在的物理記憶體位址0x0000fffffff0。但為什麼是0x0000fffffff0?因為和8086不同,現代處理器在加電時,段暫存器cs的內容為...