IA32體系結構7(x86中斷和異常調用過程)

中斷和異常概況

處理器提供了兩種中斷程序執行的機制:中斷和異常。

儘管處理過程類似,但兩種機制有很大區別。其中,中斷(interrupt)是一種異步事件,由I/O設備觸發;異常(exception)是一種同步事件,當處理器運行指令時檢測到一些預定義的條件就會觸發,異常分爲三類:faults、traps和aborts。

中斷和異常的處理過程入口點在IDT表裏面,IDT裏面有兩種門描述符:中斷門和陷阱門。兩者幾乎一樣,除了中斷門會修改EFLAGS中的IF標誌。cpu保留的異常和中斷向量如下:

處理器處理過程

如果沒有堆棧切換,調用中斷或異常的過程如下:

1.push當前EFLAGS、CS、EIP寄存器到堆棧

2.如果有錯誤碼,則push錯誤碼到堆棧

3.從中斷門或者陷阱門中取得新代碼的段選擇符和指令指針,分別加載到CS和EIP中

4.如果調用是通過中斷門,則清除EFLAGS中的IF標誌

5.開始執行過程代碼

如果涉及堆棧切換,則處理器處理過程如下:

1.臨時保存(內部)當前SS、ESP、EFLAGS、CS、EIP寄存器

2.從TSS中加載對應特權級的堆棧選擇符和堆棧指針到SS和ESP,從而切換到新堆棧

3.將之前臨時保存的SS、ESP、EFLAGS、CS、EIP推送到新堆棧

4.如果有錯誤碼,則push錯誤碼到新堆棧

5.從中斷門或者陷阱門中取得新代碼的段選擇符和指令指針,分別加載到CS和EIP中

6.如果調用是通過中斷門,則清除EFLAGS中的IF標誌

7.開始執行過程代碼

以上是中斷或異常發生時,進入過程代碼的執行步驟,從過程代碼返回是通過IRET指令,該指令和RET指令類似,除了IRET需要恢復之前被中斷代碼執行時的EFLAGS寄存器。

從同一個特權級恢復中斷,就是不涉及堆棧切換的過程,返回過程如下:

1.恢復中斷和異常之前的CS和EIP寄存器值

2.恢復EFLAGS寄存器

3.適當地遞增堆棧指針

4.恢復被中斷代碼的執行

從不同特權級恢復中斷,就是涉及堆棧切換的過程,返回過程如下:

1.執行特權級檢查

2.恢復中斷和異常之前的CS和EIP寄存器值

3.恢復EFLAGS寄存器

4.恢復中斷和異常之前的SS和ESP寄存器,結果就是堆棧切換到了被中斷代碼執行時的堆棧

5.恢復被中斷代碼的執行

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