版本1:載入img直接使用配置檔案
,可以使用斷點!!
保護模式的程式沒有辦法直接除錯。所謂的直接除錯,指的是使用debug這樣工具
進行的除錯,無論是debug32 還是傳說中的softice for dos 都不可以。唯一的方法是在
虛擬機器上進行的除錯。有一款虛擬機器,就
是專門為這樣的事情設計的。他就是bochs。
關於這個軟體的使用,在此就不介紹了。主要說一下如何進行保護模式的程式的除錯。
第乙個問題是:bochs是為了除錯保護模式的作業系統設計的。就是說,從引導過程開始的
程式,而不是已經進入了純dos,再進入保護模式的程式
。對於這個問題,我們的思路是,
設定好斷點,
進入dos之後,讓我們的程式觸發中斷即可…….
查一下bochs的手冊,上面有
記憶體讀寫的中斷
,於是首先選擇了這樣的指令:
watch read [addr]
但是隨後發現,不知道為什麼,程式無法觸發這樣的中斷。也許是因為addr給出的
位址是線性位址,而我們的程式,
最開始,只能觸發[seg:ofs]這樣的位址。
(說明:我發現
bochs中,即使這兩種格式即使指向相同的實體地址,對斷點來說也是不同的)。
第二個問題就是:設定一種容易實現的斷點,最終,發現
bochs在執行斷點上是可以
區分的。
我們只要設定乙個絕對執行的位置就可以了。
編寫程式如下:
jmpseg
equ600*1024 /16
;打算修改的段
movax,jmpseg
movds,ax
;ds=打算修改的段
xorsi,si
movax,ds:[si];修改
ds:0
的位置push
ax;安全起見,在堆疊儲存這個位置的值
movbyte ptr ds:[si],0cbh
;將這個位置設定為 retf
push
offset
back
;設定返回位置
push
csdb
0eah
;遠跳轉dw0
dwjmpseg
back:
;跳過去後馬上回來
popax
movds:[si],ax
;再恢復下面就是繼續執行了
思路就是我們在記憶體中挖出乙個絕對位置的「洞」,然後程式跳進這個洞,這個洞裡面
放的是返回,一下又回來。只要我們監視這個洞就好了。當然,安全起見,這個洞最後還要
再添上。另外,這個洞選擇的位置,我只是隨便選在600k的位置,其實還可以選擇在[40:0]
這一片位置,不過我想在虛擬機器執行過程中,可能會讀這個位置,需要執行幾次才可以,
操作上比較麻煩就沒有選擇。
程式做好了命名為bo.asm,編譯為bo.exe。格式化一張軟盤,放上dos系統的那三個
必要的檔案,再考上bo.exe. 之後,將軟盤做成img檔案(我一般用hdcopy).
這個img要
丟到bochs的目錄下,就是下圖的目錄中。
1.上圖,執行bochsdbg
2.選擇3,我們要讀入bo.img
3.選擇10
4.選擇1
5.分別輸入 bo.img auto 最後一項直接回車
6.不斷回車,一直返回到第乙個畫面
7.這個就是第乙個畫面了,回車,開始執行
8.開始執行了,會在模擬第一條指令開始的時候停下來
9.輸入 vb 0x9600:0 下斷點
10.輸入 c 讓它繼續執行
11.模擬器這邊就進入dos了~
12.執行 bo.exe 看,停在我們設定的斷點了。
這個位置也算是程式的開始,下面可以使用s命令跟蹤了~
進入保護模式
本文為 每個描述符佔8位元組,下圖中,上面位高32位,下面為低32位 disk boot ata channel 0 first hd cd on channel 0 type of disk image這個選項是vpc,我用2.6.2配置時選vpc無法啟動,得選flat才可以,2.6.0貌似選vp...
進入保護模式
以下圖2,圖4和圖5截自intel手冊 每個描述符佔8位元組,下圖中,上面位高32位,下面為低32位 disk boot ata channel 0 first hd cd on channel 0 type of disk image這個選項是vpc,我用2.6.2配置時選vpc無法啟動,得選fl...
保護模式小結
在gdt ldt以及idt中,每乙個描述符都有自己的界限和屬性等內容,是對描述符所描述物件的一種限定和保護 分頁機制中的pde和pte都含有r w以及u s位,提供了頁級保護 頁式儲存的使用使應用程式使用的是線性空間而不是實體地址,於是物理記憶體被保護起來 中斷不再像是模式下一樣使用,也提供特權檢驗...