我一直在研究x86上的中斷以及內核如何使用中斷處理程序處理各種中斷。但有一件事讓我感到困惑。
我知道中斷可能是硬件生成的,例如磁盤和定時器中斷,或者它們可能是CPU異常,如頁面錯誤,被零除異常等等。令我困惑的是某些int代碼用於處理兩者特別是INT 08-0F)。例如,Ralf Brown的清單說INT09h中斷既是KEYBOARD DATA READY
硬件中斷,也是COPROCESSOR SEGMENT OVERRUN
例外。
所以我的問題是,如果像這樣的中斷,中斷處理程序如何知道要處理哪個中斷?如何知道中斷是硬件中斷還是CPU異常
3
A
回答
2
x86通常不提供區分硬件和軟件中斷的方法。異常處理程序必須查詢外部硬件或其他方法來消除這兩種情況。
爲避免混淆,系統可以通過在相應的中斷描述符表項中設置特權級別來防止重載相同的向量。用戶模式(CPL = 3)INT指令不能在特權矢量上生成軟件異常。
對於少數例外情況,處理器會在異常堆棧幀上推送附加的錯誤代碼字。錯誤代碼字段有一個'EXT'位來指示異常是否由外部中斷引起。在IA手動音量3,第6.13節中指出:
EXT外部事件(位0) - 置位時,指示該異常 遞送外部程序的事件的過程中發生,如 中斷或更早的例外。
然而,只有少數例外推eror代碼字段,而所有這些都低於矢量處理器異常32
- 編輯 -
另一個位:不要被愚弄通過「陷阱門」和「中斷門」。中斷可以通過陷阱門,INT可以通過中斷門。唯一的區別是處理進入處理函數時的中斷使能狀態。
相關問題
- 1. 什麼硬件中斷實際上是中斷?
- 2. 單聲道+硬件中斷/信號
- 3. Linux調度程序是否知道硬件中斷(調度程序抖動)
- 4. 如何判斷庫是COM還是DCOM?
- 5. 異常和中斷
- 6. 「I/O設備請求」是外部中斷還是內部異常?
- 7. Erlang。異步http請求。如何知道連接何時中斷?
- 8. 瞭解處理器和硬件級別的硬件中斷和異常
- 9. pydev中的異常中斷
- 10. Nodejs如何知道是同步還是異步
- 11. Mongod在100%的CPU - 不知道如何診斷?
- 12. 硬件中斷列表
- 13. Java硬件中斷處理
- 14. 如何判斷字符串在元值中是空還是空?
- 15. XMPP Smack - 如何檢查連接是活動還是中斷?
- 16. 如何判斷給定的值在Java中是float還是double?
- 17. C++調試中斷異常
- 18. MATLAB中斷拋出異常
- 19. 拋出異常時中斷
- 20. 異常處理不中斷
- 21. 中斷還是繼續執行?
- 22. 是否從備份還原中斷?
- 23. 如何判斷文件是EXE還是DLL?
- 24. 內核如何知道CPU是處於用戶模式還是kenel模式?
- 25. 如何知道程序是從USB還是固定硬盤運行?
- 26. 信號,軟件中斷和硬件中斷之間的區別?
- 27. 如何判斷在瀏覽器中還是在NodeJS中運行?
- 28. 如何知道系統是Python中的Debian還是CentOS?
- 29. 不斷超越界限異常,不知道爲什麼?
- 30. 在Eclipse中的異常斷點 - 如何檢查異常對象?
有點痛苦回答這些問題。你所學到的關於彙編編程的知識已經過時了。它在28年前有效,專爲沒有協處理器的機器而設計。現代機器更先進,使用保護模式操作系統,最重要的是更復雜的中斷控制器。 – 2013-03-24 17:21:12
@HansPassant您能否添加一些相關的實際術語或關鍵詞,以便繼續以更新的方向進行此類研究? (例如,來自中斷控制器或協處理器合作詞彙表的參考) – n611x007 2014-07-08 16:49:02