中斷及中斷處理過程

2021-08-13 04:41:46 字數 2499 閱讀 3501

(from:

中斷及中斷處理過程

1. 中斷和異常的概念區別

intel的官方文件裡將中斷和異常理解為兩種中斷當前程式執行的不同機制。這是中斷和異常的共同點。不同點在於:

中斷(interrupt)是非同步的事件,典型的比如由i/o裝置觸發;異常(exception)是同步的事件,典型的比如處理器執行某條指令時發現出錯了等等。

中斷又可以分為可遮蔽中斷和非可遮蔽中斷,異常又分為故障、陷阱和異常中止3種,它們的具體區別很多書籍和官方文件都解釋的比較清楚這裡不再贅述。

關於它們的區別有兩點是需要注意的:

1)平常所說的遮蔽中斷是不包括異常的,即異常不會因為cpu的if位被清(關中斷,指令:cli)而受影響,比如缺頁異常,即使關了中斷也會觸發cpu的處理。

2)通常說的int 80h這種系統呼叫使用的中斷方式實際上硬體上是理解為異常處理的,因此也不會被遮蔽掉,這也很好理解,int 80h這種中斷方式是程式裡主動觸發的,對於cpu來說屬於同步事件,因此也就屬於異常的範疇。

2. 中斷(異常)處理過程

需要明確的一點是cpu對於中斷和異常的具體處理機制本質上是完全一致的,即:

當cpu收到中斷或者異常的訊號時,它會暫停執行當前的程式或任務,通過一定的機制跳轉到負責處理這個訊號的相關處理程式中,在完成對這個訊號的處理後再跳回到剛才被打斷的程式或任務中。這裡只描述保護模式下的處理過程,搞清楚了保護模式下的處理過程(更複雜),實模式下的處理機制也就容易理解了。

具體的處理過程如下:

0)中斷響應的事前準備:

系統要想能夠應對各種不同的中斷訊號,總的來看就是需要知道每種訊號應該由哪個中斷服務程式負責以及這些中斷服務程式具體是如何工作的。系統只有事前對這兩件事都知道得很清楚,才能正確地響應各種中斷訊號和異常。

[a]系統將所有的中斷訊號統一進行了編號(一共256個:0~255),這個號稱為中斷向量,具體哪個中斷向量表示哪種中斷有的是規定好的,也有的是在給定範圍內自行設定的。  

中斷向量和中斷服務程式的對應關係主要是由idt(中斷向量表)負責。作業系統在idt中設定好各種中斷向量對應的中斷描述符(一共有三類中斷門描述符:任務門、中斷門和陷阱門),留待cpu查詢使用。而idt本身的位置是由idtr儲存的,當然這個位址也是由os填充的。

[b]中斷服務程式具體負責處理中斷(異常)的**是由軟體,也就是作業系統實現的,這部分**屬於作業系統核心**。也就是說從cpu檢測中斷訊號到載入中斷服務程式以及從中斷服務程式中恢復執行被暫停的程式,這個流程基本上是硬體確定下來的,而具體的中斷向量和服務程式的對應關係設定和中斷服務程式的內容是由作業系統確定的。

1)cpu檢查是否有中斷/異常訊號

cpu在執行完當前程式的每一條指令後,都會去確認在執行剛才的指令過程中中斷控制器(如:8259a)是否傳送中斷請求過來,如果有那麼cpu就會在相應的時鐘脈衝到來時從匯流排上讀取中斷請求對應的中斷向量[2]。

對於異常和系統呼叫那樣的軟中斷,因為中斷向量是直接給出的,所以和通過irq(中斷請求)線傳送的硬體中斷請求不同,不會再專門去取其對應的中斷向量。

2)根據中斷向量到idt表中取得處理這個向量的中斷程式的段選擇符

cpu根據得到的中斷向量到idt表裡找到該向量對應的中斷描述符,中斷描述符裡儲存著中斷服務程式的段選擇符。

3)根據取得的段選擇符到gdt中找相應的段描述符

cpu使用idt查到的中斷服務程式的段選擇符從gdt中取得相應的段描述符,段描述符裡儲存了中斷服務程式的段基址和屬性資訊,此時cpu就得到了中斷服務程式的起始位址。

這裡,cpu會根據當前cs暫存器裡的cpl和gdt的段描述符的dpl,以確保中斷服務程式是高於當前程式的,如果這次中斷是程式設計異常(如:int 80h系統呼叫),那麼還要檢查cpl和idt表中中斷描述符的dpl,以保證當前程式有許可權使用中斷服務程式,這可以避免使用者應用程式訪問特殊的陷阱門和中斷門[3]。

4)cpu根據特權級的判斷設定即將執行的中斷服務程式要使用的棧的位址

cpu會根據cpl和中斷服務程式段描述符的dpl資訊確認是否發生了特權級的轉換,比如當前程式正執行在使用者態,而中斷程式是執行在核心態的,則意味著發生了特權級的轉換,這時cpu會從當前程式的tss資訊(該資訊在記憶體中的首位址存在tr暫存器中)裡取得該程式的核心棧位址,即包括ss和esp的值,並立即將系統當前使用的棧切換成新的棧。這個棧就是即將執行的中斷服務程式要使用的棧。緊接著就將當前程式使用的ss,esp壓到新棧中儲存起來。

6)保護當前程式的現場

cpu開始利用棧保護被暫停執行的程式的現場:依次壓入當前程式使用的eflags,cs,eip,errorcode(如果是有錯誤碼的異常)資訊。

官方文件[1]給出的棧變化的示意圖如下:

7)跳轉到中斷服務程式的第一條指令開始執行

cpu利用中斷服務程式的段描述符將其第一條指令的位址載入到cs和eip暫存器中,開始執行中斷服務程式。這意味著先前的程式被暫停執行,中斷服務程式正式開始工作。

8)中斷服務程式處理完畢,恢復執行先前中斷的程式

在每個中斷服務程式的最後,必須有中斷完成返回先前程式的指令,這就是iret(或iretd)。程式執行這條返回指令時,會從棧裡彈出先前儲存的被暫停程式的現場資訊,即eflags,cs,eip重新開始執行。

中斷及中斷處理過程

1.中斷和異常的概念區別 intel的官方文件裡將中斷和異常理解為兩種中斷當前程式執行的不同機制。這是中斷和異常的共同點。不同點在於 中斷 interrupt 是非同步的事件,典型的比如由i o裝置觸發 異常 exception 是同步的事件,典型的比如處理器執行某條指令時發現出錯了等等。中斷又可以...

中斷處理過程

部分摘自 中斷 所謂中斷就是指cpu在正常執行程式的時候,由於內部 外部事件的出發 或由程式預先設定而引起cpu暫時中止當前正在執行的程式,儲存被執行程式相關資訊到棧中,轉而去執行為內部 外部事件 或由程式預先設定的事件的中斷服務子程式,待執行完中斷服務子程式後,cpu再獲取被儲存在棧中被中斷的程式...

Linux中斷處理過程

如圖所示,完整的中斷系統由兩部分組成 硬體電路和軟體處理。1.硬體電路產生irq訊號。2.可程式設計中斷控制控制器 pic 收集irqn值,轉換成相應的向量。3.pic將中斷向量由int傳送到cpu,進入軟體中斷處理。1.初始化階段向linux核心註冊中斷處理程式。2.中斷發生時,通過中斷描述符表i...