硬件斷點原理


這些就是調試寄存器組,Dr0 ~ Dr7。Dr0,Dr1,Dr2,Dr3是用於設置硬件斷點的,由於只有4個硬件斷點寄存器,所以同時最多只能設置4個硬件斷點。產生的異常是STATUS_SINGLE_STEP(單步異常)。Dr4,Dr5是系統保留的。Dr7是一些控制位,用於控制斷點的方式,Dr6是用於顯示哪個硬件調試寄存器引發的斷點,如果是Dr0 ~ Dr3的話,相應位會被置1。即如果是Dr0引發的斷點,則Dr6的第0位被置1,如果是Dr1引發的斷點,則Dr6的第1位被置1,依次類推。因為硬件斷點同時只會觸發一個,所以Dr6的低4位最多只有一位被置1,所以在進入單步后,我們可以通過檢測Dr6的低4位是否有1的位,就可以判斷該單步是否是因為硬件斷點被斷下的。如果是硬件斷點被斷下的,進而可以通過Dr6的哪一位為1來判斷是由Dr0~Dr3中的哪個斷點斷下的。

調試控制寄存器Dr7比較重要,其32位結構如下:

 

位0 L0和位1 G0:用於控制Dr0是全局斷點還是局部斷點,如果G0為1則是全局斷點,如果L0為1則為局部斷點。G0,L0 ~G3,L3分別用於控制Dr1~Dr3。

 

LE和GE:P6 family和之后的IA32處理器都不支持這兩位。當設置時,使得處理器會檢測觸發數據斷點的精確的指令。當其中一個被設置的時候,處理器會放慢執行速度,這樣當命令執行的時候可以通知這些數據斷點。建議在設置數據斷點時需要設置其中一個。切換任務時LE會被清除而GE不會被清除。為了兼容性,Intel建議使用精確斷點時把LE和GE都設置為1。 

 

LEN0到LEN3:指定調試地址寄存器DR0到DR3對應斷點所下斷的長度。如果R/Wx位為0(表示執行斷點),則LENx位也必須為0(表示1字節),否則會產生不確定的行為。LEN0到LEN3其可能的取值如下:

(1)00 1字節
(2)01 2字節
(3)10 保留
(4)11 4字節

 

R/W0到R/W3:指定各個斷點的觸發條件。它們對應於DR0到DR3中的地址以及DR6中的4個斷點條件標志。可能的取值如下:
(1) 00 只執行
(2) 01 寫入數據斷點
(3) 10 I/O端口斷點(只用於pentium+,需設置CR4的DE位,DE是CR4的第3位 )
(4) 11 讀或寫數據斷點

 

GD位:用於保護DRx,如果GD位為1,則對Drx的任何訪問都會導致進入1號調試陷阱(int 1)。即IDT的對應入口,這樣可以保證調試器在必要的時候完全控制Drx。

此時Dr0為4271B5,表示4271B5地址處被設置了硬件斷點。現在我們來看看CONTEXT結構。

 


免責聲明!

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



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