linux中斷學習

最近看到linux中斷機制相關的知識,所以就根據學習做個總結,以便於後面回顧一下,同時也可以供同行交流學習具體涉及以下內容

什麼是中斷

中斷被定義爲一個事件,它能改變處理器執行指令的順序。它對應硬件(CPU、其他硬件設備)電路產生的電信號。
按照我們自己的理解:中斷就是程序在正常執行的過程中,受到其它事件的打斷,停止當前程序的執行,去處理來其它事件的任務,執行完之後再回來繼續執行該程序。

中斷類型

中斷一般分爲兩種類型:硬件中斷和軟中斷
在linux內核架構書中解釋:
硬件中斷
由系統自身和與之連接的外設自動的產生,它用於支持高效地實現設備驅動程序,也用於引起處理器自身對異常或錯誤的關注。
軟中斷
用於有效實現內核中的延期操作。
硬件中斷與軟中斷的區別主要在於:
硬中斷是有硬件產生的;軟中斷的處理非常像硬中斷,但是,它們僅僅是由當前正在運行的進程所產生的。
硬件中斷是可以屏蔽的,而軟中斷不能。
硬中斷處理程序需要確保儘可能快速的執行完任務,程序一般不會等待較長時間,稱爲上半部;軟中斷處理硬中斷未處理完成的工作,是一種推後執行機制稱爲下半部。

各種類別的中斷又可分爲同步中斷和異步中斷
同步中斷(異常):
這些由cpu自身產生,針對當前執行的程序。異常可能因種種原因觸發
由於運行時發生的程序設計錯誤,或者由於出現了異常的情況或者條件,導致處理器需要“外部”的協助才能處理。
異步中斷(中斷):
由外設引起的中斷,可能發生在任意時間。

中斷處理流程

在cpu得知發生中斷之後,它將進一步的處理委託給一個軟件例程,該例程可能會修復故障、提供專門的處理或將外部事件通知給用戶進程。由於每一箇中斷和異常都對應有唯一的編號,內部使用一個數組。數組項是指向處理程序函數的指針。
中斷處理分爲3個部分,首先接收到中斷,準備好環境處理中斷,接下來調用中斷處理程序,最後恢復到中斷之前的狀態,調用中斷處理程序前後兩部分可以分爲進入路徑和退出路徑。
中斷的處理
進入和退出任務還要確保從用戶態到內核態的切換,進入的關鍵任務是,從用戶態棧切換到內核態棧,但是這一點還不夠,還需要保護用戶應用程序當前的寄存器狀態,以便在中斷結束之後恢復。與上下文切換機制是一樣的
中斷處理程序可能會發生困難,也別是在處理程序的期間,發生了其它中斷,這裏就會出現所謂的中斷嵌套的問題,雖然在處理中斷程序期間可以屏蔽中斷,但是這會引起其他的問題,如遺落重要的中斷。因此對於ISR必須滿足以下要求:(1)實現必須包含儘可能少的代碼,便於快速處理
(2)可以在其他ISR執行期間調用的中斷處理程序例程,不能互相干擾
內核爲了解決這兩個問題,將每個處理程序例程分爲3個部分
(1)關鍵操作必須在中斷之後立即執行。必須禁用其它中斷
(2)非關鍵操作也應該儘快執行完成,但是允許其他中斷使能
(3)可延期的操作,不必在中斷處理程序中實現的

中斷嵌套

有些可能遇到中斷嵌套的問題,簡單的說中斷可以嵌套,但是同種類型中斷不能嵌套的。

	中斷上下文

操作系統工作模式分爲內核態和用戶態,內核模塊運行在內核空間,而用戶應用程序運行在用戶空間,他們是不同的級別,對系統資源具有不同的訪問權限,都分別有自己的內存映射,即自己的地址空間。
用戶空間的應用程序,通過系統調用,進入內核空間。由內核代表該進程運行於內核空間,這就涉及到上下文的切換,用戶空間和內核空間具有不同的地址映射,通用或專用的寄存器組,而用戶空間的進程要傳遞很多變量、參數給內核,內核也要保存用戶進程的一些寄存器、變量等,以便系統調用結束後回到用戶空間繼續執行。
所謂“中斷上下文”,就是硬件通過觸發信號,導致內核調用中斷處理程序,進入內核空間。這個過程中,硬件的一些變量和參數也要傳遞給內核,內核通過這些參數進行中斷處理。中斷上下文,其實也可以看作就是硬件傳遞過來的這些參數和內核需要保存的一些其他環境(主要是當前被中斷的進程環境)。
關於中斷上下文部分可以讀一下
https://blog.csdn.net/yusiguyuan/article/details/12183743

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