linux中斷(與異常)處理過程

2021-06-20 13:31:58 字數 2920 閱讀 8010

來自:linux核心修煉之道

中斷處理基本過程:首先裝置產生中斷,並通過中斷線將中斷訊號送往中斷控制器。如果該中斷沒有被遮蔽,則會被送往 cpu 的 intr 引腳。cpu 立即停止當前的工作,根據從中斷控制器獲得的中斷向量號,從 idt(interrupt descriptor table中斷描述符表) 中找到相應的門描述符,從而獲取中斷服務程式的位址並執行。

異常處理基本過程:與中斷不同,異常並不需要經過中斷控制器**電訊號。當異常發生時,cpu 通過其特定的中斷向量號,從 idt 中查詢相應的門描述符,並獲取異常服務程式的位址。

中斷控制器的工作

中斷控制器是外部裝置和 cpu 之間中斷訊號傳遞的橋梁,如圖 6.10 所示為中斷控制器 8259a 在中斷處理過程中所做的工作。

8259a 主要有 3 個暫存器用於對中斷的響應與處理。

irr:(中斷請求暫存器,記錄是否已收到中斷請求)

即 interrupt request register,共 8bit,對應 ir0~ir7 八個中斷引腳。當某個

引腳的中斷請求到來後,若該引腳沒有被遮蔽,則 irr 中對應的 bit 被置為 1,表示已經收到設

備的中斷請求,但還未提交給 cpu。

isr: (中斷服務暫存器,記錄是否已經**中斷給cpu)

interrupt service register,8bit,共對應 ir0~ir7 八個中斷引腳。 irr 中當的某個中斷請求被送往 cpu 後,isr 中對應的 bit 被置為 1,表示中斷已提交給 cpu,但 cpu還未處理完。

imr:

即 interrupt mask register,中斷遮蔽暫存器,共 8bit,對應 ir0~ir7 八個中斷引腳。當某個bit 置為 1 時,對應的中斷引腳被遮蔽。

8259a 的各個中斷引腳之間有一定的優先順序,同時也有兩種優先順序管理方式:固定優先順序與迴圈優先順序。固定優先順序指優先順序固定不變,號碼越小優先順序越高。迴圈優先順序指優先順序在系統工作過程中可以動態改變。

8259a 支援兩種中斷巢狀模式:一般巢狀模式與特殊巢狀模式。一般巢狀模式是指,當乙個中斷正在被 cpu 處理時,優先順序等於或低於該中斷的中斷被自動遮蔽,而更高優先順序的中斷則會被立即送往 cpu。特殊巢狀模式與一般巢狀模式的區別為,當乙個中斷正在被 cpu 處理時,同級的中斷不被遮蔽。linux 預設使用一般巢狀模式。

下面是 8259a 在中斷處理過程中所要完成的工作。

(1)中斷請求。

裝置發起中斷時,與其相連的 ir 引腳上產生電訊號,若對應的中斷沒有被遮蔽,即 imr中相應位為 0,則設定 irr 中的相應位為 1,並通過 int 引腳向 cpu 的 intr 引腳發出中斷請求訊號。若已經被遮蔽,則僅僅丟棄該中斷請求。

(2)中斷響應。

cpu 響應中斷必須滿足 3 個條件:至少有乙個中斷請求;cpu 允許中斷;當前指令執行完畢。因此,當 8259a 向 cpu 提交中斷請求訊號時,cpu 可能正在執行一條指令,並不會立即進行響應。

(3)此時,可能有其他 irq 線也產生了中斷請求,如果沒有被遮蔽,那麼這些請求對應的 irr位也會被設定為 1。

(4)而當 cpu 執行完一條指令時,會去檢查 intr 管腳是否有訊號,即是否有新的中斷請求,如果有,還要檢查eflags 暫存器的中斷允許標誌 if 是否為 1,若 if 為 1,則通過 inta 引腳應答 8259a,表示收到中斷請求。

(5)優先順序判定。

8259a 收到 cpu 的應答後,在 irr 中挑選優先順序最高的中斷,將其在 isr 中的對應位置 1,並將 irr 中相應位置 0,表明此中斷正在接受 cpu 的處理。

(6)提交中斷向量。

cpu 通過 inta 引腳第二次發出脈衝(每次處理完中斷服務都傳送inta脈衝,所以第一次發脈衝也可以看作是上一次處理完資料),8259a 收到後根據被設定的起始向量號(通過初始化命令暫存器 icw 被初始化),計算最高優先順序中斷的中斷向量(比如起始向量號為 16,當前中斷請求為 ir3,則得到的中斷向量為 16+3=19),並將它通過資料線 d0~d7 提交給 cpu。

(7)中斷結束(兩種清空isr的方式)。

提交中斷向量之後,8259a 會檢測是否aeoi(auto eoi)模式,若是,則自動清除中斷請求訊號, isr 中的相應位清零。

將若不是,則需要等待 cpu 傳送 eoi end of interrupt,(cpu 通知 pic 中斷處理結束的方式,由中斷服務程式發起)指令。收到 eoi 後,isr 中的相應位才會被

清零。上述過程中,需要注意的是,如果乙個中斷請求被遮蔽,則它將會被丟棄,從而失去參加優先順序判定的機會。

另外需要注意的是,對中斷請求的優先順序判定位於 8259a 中。

假如 cpu 正在處理 irq1 線來的中斷請求,此時 isr 中 irq1 的相應位為 1。如果這時有乙個來自 irq2 的中斷請求產生,8259a 會將其同 isr 中

的值進行比較,發現比它優先順序高的 irq1 所對應的位已經被置位,因此僅設定 irr 中的相應位。如果這時來的是 irq0,與 isr 比較後,8259a 會立即將 isr 中 irq0 對應的位置 1,並向 cpu 提交中斷請求。

因為 cpu 還正在處理 irq1,所以這時 isr 中 isr0 與 irq1 的相應位都為 1。

如果 8259a 工作於 aeoi 模式,那麼 isr 中的位總是被清零的(在 aeoi 模式下,8259a 只要向 cpu提交了中斷向量就會自動將 isr 中的相應位清零)

,這就意味著如果有新的中斷請求產生,8259a 就會立即向 cpu 提交中斷請求,即使 cpu 正在處理 irq0 的中斷,cpu 只會簡單地應答 8259a。因此,這種情

況下低優先順序的中斷就可能會中斷高優先順序的中斷服務程式。

Linux中斷處理過程

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

Linux中斷處理過程

中斷被觸發後首先通知到的是cpu 1.cpu需要判斷自己當前所處的模式,根據cpl暫存器的值執行不同操作。如果cpl表明目前正處於核心態,則不需要作切換,相反,如果cpl表明目前是使用者態,那麼需要將自己標為標為核心態。當然,在標記自己之前,必然會存在一些暫存器的儲存以便日後恢復。2.需要做一些現場...

中斷處理過程

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