2010-03-23 82 views
0

INTEL X86平臺。 我的程序運行在保護模式下的2M絕對地址處開始,一切看起來都不錯,但是當我用「sti」啓用中斷時,CPU將重新啓動。 爲什麼?在「enbale中斷」之前有沒有必要的初始化? 我已經設置了idtptr,但它似乎沒有工作。「STI」,在保護模式下,CPU將重新啓動

+0

那麼,有安裝中斷處理程序... – Potatoswatter 2010-03-23 07:11:08

回答

0

你有中斷處理程序將在保護模式下工作嗎?

0

CPU可能是三重故障,當處理雙重故障時發生異常時會發生這種情況。當CPU發生三重故障時,它會重置。

這可能是由錯誤地設置中斷描述符表引起的。

的OSDev Wiki有一個很好的文章,可以幫助你在這裏:你要麼沒有http://wiki.osdev.org/Interrupt_Descriptor_Table

+0

但我用「sidt」,基地和限制是正確的。我如何確定我的中斷描述符表的正確性? – user299668 2010-03-24 07:15:25

+0

這是一件棘手的事情,我不是保護模式中斷的專家。你最好的選擇是在http://forum.osdev.org上的OSDev論壇上提問 – 2010-03-24 08:08:36

1

的IDT定義,或者你已經正確地做到了。根據你的意見之一',但我用「sidt」,基地和限制是正確的'... SIDT是「存儲中斷描述符表」。您需要使用LIDT來加載IDT和IDTR。

此外,您應該爲每個Intel CPU異常(例如GPF,PF等)定義處理程序。請參閱英特爾程序員指南3A & 3B。

在爲PIC或IO APIC編寫處理程序(驅動程序)之前,還可以屏蔽PIC或IO APIC上的任何IRQ。

0

以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只是停止接收中斷和異常,並且向量超出了表限制!實際上,每個中斷都會導致一般保護異常!