深入剖析Linux中斷機制 中斷概述

2021-05-24 04:36:48 字數 3430 閱讀 9283

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作乙個粗淺的解釋,不對之處敬請指正!本節我們先來說一下為什麼要引入軟體中斷?一般來說,一次中斷服務的...