1. 完整的中斷處理過程分為那幾個階段
1)中斷響應的事前准備:
系統要想能夠應對各種不同的中斷信號,總的來看就是需要知道每種信號應該由哪個中斷服務程序負責以及這些中斷服務程序具體是如何工作的。系統只有事前對這兩件事都知道得很清楚,才能正確地響應各種中斷信號和異常。
2) CPU檢查是否有中斷/異常信號
CPU在執行完當前程序的每一條指令後,都會去確認在執行剛才的指令過程中中斷控制器(如:8259A)是否發送中斷請求過來,如果有那麼CPU就會在相應的時鍾脈沖到來時從匯流排上讀取中斷請求對應的中斷向量。
對於異常和系統調用那樣的軟中斷,因為中斷向量是直接給出的,所以和通過IRQ(中斷請求)線發送的硬體中斷請求不同,不會再專門去取其對應的中斷向量。
3) 根據中斷向量到IDT表中取得處理這個向量的中斷程序的段選擇符
CPU根據得到的中斷向量到IDT表裡找到該向量對應的中斷描述符,中斷描述符里保存著中斷服務程序的段選擇符。
4) 根據取得的段選擇符到GDT中找相應的段描述符
CPU使用IDT查到的中斷服務程序的段選擇符從GDT中取得相應的段描述符,段描述符里保存了中斷服務程序的段基址和屬性信息,此時CPU就得到了中斷服務程序的起始地址。
5) CPU根據特權級的判斷設定即將運行的中斷服務程序要使用的棧的地址
CPU會根據CPL和中斷服務程序段描述符的DPL信息確認是否發生了特權級的轉換,比如當前程序正運行在用戶態,而中斷程序是運行在內核態的,則意味著發生了特權級的轉換,這時CPU會從當前程序的TSS信息(該信息在內存中的首地址存在TR寄存器中)里取得該程序的內核棧地址。
6) 保護當前程序的現場
CPU開始利用棧保護被暫停執行的程序的現場:依次壓入當前程序使用的eflags,cs,eip,errorCode(如果是有錯誤碼的異常)信息。
7) 跳轉到中斷服務程序的第一條指令開始執行
CPU利用中斷服務程序的段描述符將其第一條指令的地址載入到cs和eip寄存器中,開始執行中斷服務程序。這意味著先前的程序被暫停執行,中斷服務程序正式開始工作。
8) 中斷服務程序處理完畢,恢復執行先前中斷的程序
在每個中斷服務程序的最後,必須有中斷完成返回先前程序的指令,這就是iret(或iretd)。程序執行這條返回指令時,會從棧里彈出先前保存的被暫停程序的現場信息,即eflags,cs,eip重新開始執行。
(1)中斷處理程序的結構擴展閱讀
硬體中斷導致處理器通過一個上下文切換(context switch)來保存執行狀態(以程序計數器和程序狀態字等寄存器信息為主);軟體中斷則通常作為CPU指令集中的一個指令,以可編程的方式直接指示這種上下文切換,並將處理導向一段中斷處理代碼。
中斷在計算機多任務處理,尤其是實時系統中尤為有用。這樣的系統,包括運行於其上的操作系統,也被稱為「中斷驅動的」(interrupt-driven)。
中斷使CPU中止正在執行的程序而轉去處理特殊事件的操作,這些引起中斷的事件稱為中斷源,它們可能是來自外設的輸入輸出請求,也可能是計算機的一些異常事故或其它內部原因。
在運行一個程序的過程中,斷續地以「插入」方式執行一些完成特定處理功能的程序段,這種處理方式稱為中斷。
2. 中斷處理的流程包括哪些步驟
一個完整的中斷處理過程應該包括:中斷請求、中斷排隊或中斷判優、中斷響應、中斷處理和中斷返回等環節。
中斷請求是由中斷源向CPU發出中斷請求信號。外部設備發出中斷請求信號要具備以下兩個條件:
(1)外部設備的工作已經告一段落。例如輸入設備只有在啟動後,將要輸入的數據送到介面電路的數據寄存器(即准備好要輸入的數據)之後,才可以向CPU發出中斷請求。 (2)系統允許該外設發出中斷請求。如果系統不允許該外設發出中斷請求,可以將這個外設的請求屏蔽。當這個外設中斷請求被屏蔽,雖然這個外設准備工作已經完成,也不能發出中斷請求。
中民申請是隨機的,有時會出現多個中斷源同時提出中斷申請。但CPU每次只能響應一斷源的請求,那麼究竟先響應哪一個中斷源的請求呢?這就必須根據各中斷源工作性質的輕重緩急,預先安排一個優先順序順序,當多個中斷源同時申請中斷時,即按此優先順序順序進行排隊,等候CPU處理。一般是把最緊迫和速度最高的設備排在最優先的位置上。CPU首先響應優先順序別最高的中斷源。當中斷處理完畢,再響應級別低的中斷申請。
中斷排隊可以採用硬體的方法,也可以採用軟體的方法。前者速度快,但需要增加硬設備;後者無需增加硬設備,但速度慢,特別是中斷源很多時尤為突出。
當CPU響應中斷後,就用軟體查詢以確定是哪些外設申請中斷,並判斷它們的優先權。當CPU響應中斷後,把中斷寄存器的狀態作為一個外設讀入CPU,逐位檢測它們的狀態,若哪一位為1,則該位對應的外設有中斷請求,應轉到相應的服務程序的入口。