我正在嘗試爲x86上的常規保護錯誤(GP#13)編寫ISR。我無法從INTEL文檔中找出如何找出導致異常的錯誤地址。我知道頁錯誤例外(GP#14)cr2寄存器保存錯誤地址。任何幫助表示讚賞。識別常規保護錯誤(x86)上的錯誤地址
4
A
回答
9
我在這裏所做的所有參考都是從AMD64 Architecture Programmer's Manual Volume 2: System Programming開始的,它也描述了傳統的保護模式(即x86)行爲。
圖8-8 240頁上顯示了中斷,以相同的特權級別後堆棧佈局(即,棧佈局輸入一個ISR時):
在8.2節。 14,你可以看到,#GP
提供錯誤代碼和下面的興趣也:
計劃重新啓動。
#GP
是一個故障型異常。在大多數情況下, 保存的指令指針指向導致#GP
的指令。有關在 任務切換期間發生此異常時的後果的說明,請參閱第230頁上的「任務切換期間的例外情況」。
引用的部分提到下列:加載一個段 選擇一個任務切換過程中,可能會發生
異常。訪問TSS時也可能發生頁面錯誤。在這些 的情況下,硬件任務切換機制完成從TSS加載新的 任務狀態,然後觸發適當的例外 機制。沒有執行其他檢查。 發生這種情況時,保存的 指令指針指向新任務中的第一條指令。
因此,除非您正在使用硬件任務切換,否則保存的指令指針始終指向錯誤指令。
要獲取錯誤指令的地址,只需從ISR堆棧中獲取已保存的EIP
和CS
值。 (如果您使用的是平板內存型號,並且您的所有細分受衆羣覆蓋整個4GB,那麼保存的CS
當然不感興趣)。
movl 4(%esp), %eax
movw 8(%esp), %ebx
現在,EAX
包含保存EIP
和EBX
保存CS
。
編輯:當然,作爲comments指出的Alex,以防#GP
是由內存訪問造成的,你要訪問的內存地址,您需要將錯誤指令解碼。
相關問題
- 1. 無法識別的規則錯誤{LINEO ++;}
- 2. Lex錯誤無法識別的規則
- 3. Flex無法識別的規則錯誤
- 4. fslogger:ioctl錯誤:錯誤地址
- 5. HLT指令導致QEMU中的常規保護錯誤
- 6. ldap_add():地址:Object類的違規錯誤
- 7. JSON.parse錯誤保護
- 8. Java錯誤無法識別的錯誤
- 9. 錯誤地址
- 10. Android錯誤識別
- 11. 識別python錯誤
- 12. responseAsSlurper錯誤常規
- 13. 如何處理某些SonarQube錯誤地識別規則?
- 14. 無法啓動服務器QWsServer錯誤:地址受保護
- 15. 受保護工作表上的錯誤
- 16. _mm_shuffle_epi8上的一般保護錯誤
- 17. execvp:錯誤的地址錯誤
- 18. 與execvp錯誤的地址錯誤
- 19. Pyxb錯誤地識別簡單類型
- 20. C:「讀取:錯誤的地址」和「寫入:錯誤的地址」
- 21. jQuery識別錯誤的ID
- 22. 錯誤:錯誤:語法錯誤,無法識別的表達:
- 23. SUMO地址錯誤
- 24. 錯誤RIME地址
- 25. readv:錯誤地址
- 26. 可以(錯誤地)使用Exception.HelpLink來識別異常對象嗎?
- 27. 笨CSRF保護錯誤:
- 28. 虛保護功能錯誤
- 29. 識別常規
- 30. WCF錯誤類型識別
爲了得到實際地址(如果#GP是由存儲器訪問引起的),OP將需要解碼CS:EIP處的指令,並可能使用寄存器值替換爲各種ECX * 4 + EAX + 3。 – 2012-04-28 08:21:05
@Alex:你說得對,我更新了答案。 – Job 2012-04-28 08:33:46
謝謝喬布斯和亞歷克斯。 – 2012-04-28 18:01:51