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的內容為...