異常架構

和中斷相比,異常最大的不同在於它是在程序的執行過程中同步發生的。例如下面這個程序:

void main(){

int a = 10;

a = a/0;

}

程序運行到a = a/0;一句時必然引起一個除0異常,但不能預料該程序在執行時是否會發生中斷。異常根據產生的原因和嚴重程度可以分爲如下三類。

(1)錯誤 :由某種錯誤情況引起,一般可以被錯誤處理程序糾正。錯誤發生時,處理器將控制權轉移給對應的處理程序。例如常見的缺頁錯誤就屬於此類。

(2)陷阱:指在執行了一條特殊指令後引起的異常。例如linux中用於實現系統調用的INT 80 指令就屬於此類。

(3)終止:指嚴重的不可恢復的錯誤,將導致程序終止的異常。例如MCA。

和中斷門一樣,陷阱門存放在IDT表中。異常發生後,CPU用該異常的vector號索引其對應的陷阱門。x86架構將vector 0~19預留給各個異常。

操作系統對中斷/異常的處理流程

雖然各個操作系統對於中斷/異常處理實現不同,但基本流程遵循如下的順序。

一箇中斷/異常發生,打斷當前正在執行的任務。

(1)CPU通過vector 索引IDT表得到對於的"門",並獲得其處理函數的入口地址。

(2)程序跳轉到處理函數執行,由於處理函數存放在CPL= 0 的代碼段,程序可能會發生權限提升。處理函數通常執行下列幾個步驟。:保存被打斷的上下文,並開始執行處理函數。如果是中斷,處理完後需要些EOI寄存器應答,異常不需要。恢復打斷的任務上下文準備返回。

(3)從中斷/異常的處理函數返回,恢復被打斷的任務,使其繼續執行。

操作系統可能對上述執行路徑進行封裝,也會引入諸如軟中斷之類的機制,但總順序如上所述,不會有太大的不同。

中斷/異常屬於處理器架構中比較複雜的部分,上面的內容仍然有很多細節沒有涉及到。目前,新的中斷方式——MSI已經被廣泛應用。

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章