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. 快速CPU環模式保護問題
- 2. 如何在Leiningen的互動模式下重新啓動swank?
- 3. 在mod_wsgi守護進程'重新啓動
- 4. int 13h在Windows保護模式下?
- 5. Django不斷在開發模式下重新啓動自己
- 6. 如何在CPU處於保護模式時讀/寫硬盤?
- 7. 如何將模擬器重新啓動到恢復模式
- 8. 如何讓Rails 3在開發模式下重新加載STI類?
- 9. 關於硬件驅動程序在保護模式下
- 10. 檢測一個進程是否由受保護模式下的IE啓動
- 11. 組織模式:保護重點
- 12. 將monit重新啓動delayed_job
- 13. 在python * nix系統中自動重新啓動守護進程
- 14. 如何在不重新啓動的情況下「重新啓動」Internet Explorer服務
- 15. 在重新啓動
- 16. 保存WindowState並在重新啓動/重新登錄後恢復
- 17. 如何在Web模式下啓動GWT?
- 18. 在調試模式下啓動tomcat 6?
- 19. 模擬器在重新啓動時需要重新啓動(react-native run-ios)
- 20. c#在窗口模式下啓動新進程
- 21. Windows保護模式 - 內存
- 22. 保護CRTP模式調用
- 23. X86:保護模式,GDT,IDT
- 24. 在不重新啓動Xorg的情況下重新加載XINITRC
- 25. 調試模式隨機在手機上重新啓動
- 26. 在不重新發明輪子的情況下保護REST API
- 27. 活動重新啓動時,電話查看模式更改
- 28. 查看模式更改時活動重新啓動
- 29. Python模塊在重新啓動主模塊後沒有更新
- 30. 重啓之前保護程序
那麼,有安裝中斷處理程序... – Potatoswatter 2010-03-23 07:11:08