INTEL X86平臺。 我的程序運行在保護模式下的2M絕對地址處開始,一切看起來都不錯,但是當我用「sti」啓用中斷時,CPU將重新啓動。 爲什麼?在「enbale中斷」之前有沒有必要的初始化? 我已經設置了idtptr,但它似乎沒有工作。「STI」,在保護模式下,CPU將重新啓動
回答
你有中斷處理程序將在保護模式下工作嗎?
CPU可能是三重故障,當處理雙重故障時發生異常時會發生這種情況。當CPU發生三重故障時,它會重置。
這可能是由錯誤地設置中斷描述符表引起的。
的OSDev Wiki有一個很好的文章,可以幫助你在這裏:你要麼沒有http://wiki.osdev.org/Interrupt_Descriptor_Table
但我用「sidt」,基地和限制是正確的。我如何確定我的中斷描述符表的正確性? – user299668 2010-03-24 07:15:25
這是一件棘手的事情,我不是保護模式中斷的專家。你最好的選擇是在http://forum.osdev.org上的OSDev論壇上提問 – 2010-03-24 08:08:36
的IDT定義,或者你已經正確地做到了。根據你的意見之一',但我用「sidt」,基地和限制是正確的'... SIDT是「存儲中斷描述符表」。您需要使用LIDT來加載IDT和IDTR。
此外,您應該爲每個Intel CPU異常(例如GPF,PF等)定義處理程序。請參閱英特爾程序員指南3A & 3B。
在爲PIC或IO APIC編寫處理程序(驅動程序)之前,還可以屏蔽PIC或IO APIC上的任何IRQ。
以99%的概率,你已經經歷了被稱爲三重故障的現象。根據IA-32架構,在異常觸發的情況下,CPU自動嘗試執行適當的異常處理程序。如果此嘗試導致另一個異常(這種情況稱爲雙重故障),則CPU會嘗試執行雙重故障異常處理程序(IDT中的0x08)。如果在此嘗試期間另一個異常被觸發,則CPU進入三重故障狀態。 CPU通過關閉週期來回復它,這通常會導致主板硬件啓動CPU重置,從而導致整個計算機重新啓動。
你的情況,你有行動的下一個序列:
interrupt from some device -> exception -> exception -> reset
normal execution -> fault -> double fault -> triple fault
確保你已經正確初始化IDT安裝了全部256個描述符,分別指向正確的處理程序。注意!您可以使用任意大小的表格加載IDT。但這並不意味着CPU只是停止接收中斷和異常,並且向量超出了表限制!實際上,每個中斷都會導致一般保護異常!
- 1. 進入保護模式重新啓動
- 2. 快速CPU環模式保護問題
- 3. 在重新啓動時維護「熄燈」模式(View.setSystemUiVisibility)
- 4. 如何在Leiningen的互動模式下重新啓動swank?
- 5. Unicorn Rails - 在生產模式下啓動時需要100%的CPU
- 6. 在mod_wsgi守護進程'重新啓動
- 7. NASM在保護模式下繪圖
- 8. int 13h在Windows保護模式下?
- 9. Redis正在保護模式下運行
- 10. 在調試模式下重新啓動程序
- 11. Django不斷在開發模式下重新啓動自己
- 12. 如何在CPU處於保護模式時讀/寫硬盤?
- 13. 如何將模擬器重新啓動到恢復模式
- 14. 如何讓Rails 3在開發模式下重新加載STI類?
- 15. 關於硬件驅動程序在保護模式下
- 16. 重新保護Excel工作表,啓用自動篩選器
- 17. 的Cron重新啓動的Python守護
- 18. 檢測一個進程是否由受保護模式下的IE啓動
- 19. 組織模式:保護重點
- 20. 以編程方式在IE中啓用增強保護模式
- 21. accepts_nested_attributes_for爲STI模式
- 22. Tomcat AccessLogValve模式重新加載而不重新啓動
- 23. 風景模式視頻活動正在重新啓動
- 24. GDB realmode保護模式,動態disassamble
- 25. 將重新啓動應用程序重新啓動前面
- 26. 將monit重新啓動delayed_job
- 27. 在python * nix系統中自動重新啓動守護進程
- 28. 保證服務在重新啓動後首先啓動
- 29. 重新啓動後重新啓動
- 30. 如何在不重新啓動的情況下「重新啓動」Internet Explorer服務
那麼,有安裝中斷處理程序... – Potatoswatter 2010-03-23 07:11:08