中斷和異常概況
處理器提供了兩種中斷程序執行的機制:中斷和異常。
儘管處理過程類似,但兩種機制有很大區別。其中,中斷(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.恢復被中斷代碼的執行