1、中斷概述
1.1、為什麼需要中斷?
等到硬體真正完成了請求的操作之後,再回過頭來對它進行處理。想要實現這種功能,輪詢
(polling)
可能會是一種解決辦法
。可以讓核心定期對裝置的狀態進行查詢,然後做出相應的處理。不過這種方法很可能會讓核心做不少無用功,因為無論硬體裝置是正在忙碌著完成任務還是已經大功告成,輪詢總會周期性地重複執行。更好的辦法是由我們來提供一種機制,
讓硬體在需要的時候再向核心發出訊號
(變核心主動為硬體主動
)。這就是中斷機制。
硬體裝置生成中斷的時候並不考慮與處理器的時鐘同步—換句話說就是中斷隨時可以產生。因此,
核心隨時可能因為新到來的中斷而被打斷。
從物理學的角度看,中斷是一種電訊號,由硬體裝置生成,
並直接送入中斷控制器的輸入引腳上。然後再由中斷控制器向處理器傳送相應的訊號。處理器一經檢測到此訊號,便中斷自己的當前工作轉而處理中斷。
此後,處理器會通知作業系統已經產生中斷,這樣,作業系統就可以對這個中斷進行適當的處理了。
不同的裝置對應的中斷不同,而
每個中斷都通過乙個惟一的數字標識
。因此,來自鍵盤的中斷就有別幹來自硬碟的中斷,從而使得作業系統能夠對中斷進行區分,並知道哪個硬體裝置產生了哪個中斷。這樣,作業系統才能給不同的中斷提供不同的中斷處理程式。
這些中斷值通常被為中斷請求
(irq)
線。通常
irq都是一些數值量。例如在
pc上,
irq0
是時鐘中斷,而
irq 1
是鍵盤中斷。但並非所有的中斷號都是這樣嚴格定義的。例如,對於連線在
pci匯流排上的裝置而言,
中斷是動態分配的
。而在嵌入式系統中,由於中斷線有限,一般外設和中斷都是一一匹配的,很少有動態分配中斷的。不管怎樣,重點在於特定的中斷總是與特定的裝置相關聯,並且核心要知道這些資訊。
在作業系統中,討論中斷就不能不提及異常。廣義的中斷可分為同步(
synchronous
)中斷和非同步(
asynchronous
)中斷:
同步中斷:是當指令執行時由
控制單元產生,之所以稱為同步,
是因為只有在一條指令執行完畢後
才會發出中斷,
而不是發生在**指令執行期間,比如系統呼叫。
非同步中斷:是指由其他硬體裝置依照
時鐘訊號
隨機產生,即意味著中斷能夠在指令之間發生,
例如鍵盤中斷。
一般由處理器本身產生的同步中斷
稱為異常(
exception
),非同步中斷被稱為中斷(
interrupt
)。中斷可分為可遮蔽中斷(
maskable interrupt
)和非遮蔽中斷(
nomaskable interrupt
)。異常可分為故障(
fault
)、陷阱(
trap
)、終止(
abort
)三類。 表1
:中斷類別及其行為
類別 原因
非同步/同步
返回行為 中斷
來自i/o裝置的訊號非同步
總是返回到下一條指令 陷阱
有意的異常 同步
總是返回到下一條指令 故障
潛在可恢復的錯誤 同步
返回到當前指令 終止
不可恢復的錯誤 同步
不會返回
在處理器執行到由於程式設計失誤而導致的錯誤指令
(例如被0除
)的時候,或者是
在執行期間出現特殊情況
(例如缺頁
),必須靠核心來處理的時候,處理器就會產生乙個異常。因為許多處理器體系結構
處理異常與處理中斷的方式類似
,因此,核心對它們的處理也很類似。
通過軟中斷實現系統呼叫,那就是陷人核心,然後引起一種特殊的異常—系統呼叫處理程式異常。你將會看到,中斷的工作方式與之類似,其差異只在於
中斷是由硬體而不是軟體引起的。
1.4、中斷處理程式
在響應乙個特定中斷的時候,核心會執行乙個函式,該函式叫做中斷處理程式
(interrupt handler)
或中斷服務例程
(interrupt service routine, isr)
。產生中斷的每個裝置都有乙個相應的中斷處理程式。
在linux
中,中斷處理程式看起來就是普普通通的
c函式。只不過這些函式必須
按照特定的型別宣告,以便核心能夠以標準的方式傳遞處理程式的資訊
。中斷處理程式與其他核心函式的
真正區別在於:中斷處理程式是被核心呼叫來響應中斷的,而它們執行於我們稱之為中斷上下文的特殊上下文中。
中斷可能隨時發生,因此中斷處理程式也就隨時可能執行。所以必須保證中斷處理程式能夠快速執行,
這樣才能保證盡可能快地恢復中斷**的執行
。因此,
儘管對硬體而言,迅速對其中斷進行服務非常重要
,但對系統的其他部分而言,讓中斷處理程式在盡可能短的時間內完成執行也同樣重要。
即使是最精簡版的中斷服務程式,它也要與硬體進行互動,告訴該裝置中斷已被接收。我們可以考慮一下網路裝置的中斷處理程式面臨的挑戰。該處理程式除了要對硬體應答,
還要把來自硬體的網路資料報拷貝到記憶體,
對其進行處理後再交給合適的協議棧或應用程式。顯而易見,這種工作量不會太小,尤其對於如今的千兆位元和萬兆位元乙太網卡而言。
因此我們一般把中斷處理切為兩個部分或兩半。中斷處理程式是上半部
(top half)
—接收到乙個中斷,它就立即開始執行,但只做有嚴格時限的工作,
例如對接收的中斷進行應答或復位硬體,
這些工作都是在所有中斷被禁止的情況下完成的。
能夠被允許稍後完成的工作會推遲到下半部
(bottom half)
去。此後,在合適的時機,下半部會被開中斷執行。
以網絡卡作為例項,當網絡卡接收流入網路的資料報時,需要通知核心資料報到了。網絡卡需要立即完成這件事,從而優化網路的吞吐量和傳輸週期,以避免超時。因此,網絡卡立即發出中斷
:嘀,核心,我這裡有最新資料報了。核心通過執行網絡卡已註冊的中斷處理程式來做出應答。
中斷開始執行,
應答硬體,拷貝最新的網路資料報到記憶體,然後讀取網絡卡更多的資料報。
這些都是
重要、緊迫而又與硬體相關的工作
。處理和運算元據包的其他工作在隨後的下半部中進行。
Linux中斷機制
中斷 interrupt 被定義為乙個事件,該事件改變處理器執行的指令順序,這樣的事件與cpu晶元內外部硬體電路產生的電訊號相對應。中斷通常分為同步 synchronous 中斷和非同步 asynchronous 中斷。同步中斷指的是當指令執行時由cpu控制單元產生的,之所以稱為同步,是因為只有在一...
LINUX中斷機制與訊號
在學習apue時學習訊號程式設計,很多地方不是理解,便查閱了網路上的相關資料,最常見的一句話就是 訊號是中斷機制的一種模擬 既然提到了中斷,那就首先了解了一下中斷的具體分類以及實現,最後再找出中斷和訊號的區別。l 中 斷 也稱硬體中斷 定義 中斷是由其他硬體裝置依照cpu 時鐘週期訊號隨機產生的。分...
linux軟體中斷 tasklet機制
注意 軟體中斷不是軟中斷。軟體中斷不依賴於底層架構,類似於訊號機制 而軟中斷依賴於底層架構,採用特殊的指令產生,系統呼叫就是採用的軟中斷,arm架構下使用swi指令產生軟中斷。本文只是對tasklet作乙個粗淺的解釋,不對之處敬請指正!本節我們先來說一下為什麼要引入軟體中斷?一般來說,一次中斷服務的...