由中斷和異常的區別可知,中斷處理程式以一部方式執行,並且他有可能會打斷其他重要**(甚至包括其他中斷處理程式)的執行。因此為了避免被打斷的**停止時間過長,中斷處理程式應該執行得越快越好。
中斷處理程式不再程序上下文中執行,所以他們不能阻塞,所以他們有很高的的實現要求。作業系統個必須有乙個快速、非同步、簡單的機制負責對硬體做出迅速響應並完成那些時間要求很請嚴格的操作。
因此,整個中斷處理流程被分成了兩個部分:第乙個部分是中斷處理程式,核心通過對他的非同步執行完成對硬體中斷的即時響應。第二部分是下半部。
下半部的任務就是執行與中斷處理密切相關但中斷處理程式本身不執行的工作。
下半部實現機制通常有軟中斷,tasklet,工作佇列等。
linux通過軟中斷實現下半部機制。軟中斷是在編譯期間靜態分配的,在核心中其實就是乙個叫做softirq_vec的陣列,陣列包含了32個元素型別為softirq_action的元素。陣列下標就表示了對應的軟中斷的優先順序。linux重要前6個元素被有效地使用。
每個softirq_action包含兩個關鍵字段:指向軟中斷函式的乙個action指標和指向軟中斷函式需要的通用資料結構的data指標。在處理軟中斷的是後,其實就是呼叫softirq_action中的函式指標,這個函式就是相應的軟中斷函式,完成被推遲的工作。
cpu中有乙個關鍵的32位掩碼描述掛起的軟中斷。什麼叫掛起的軟中斷?當某個中斷處理程式在完成對中斷的即時響應後,將複雜的後半部工作交給軟中斷,讓核心知道這個軟中斷需要被處理。因此他需要將這個軟中斷標記為掛起,後續,核心在某些時機就會檢查有哪些軟中斷被掛起,然後呼叫softirq_action的函式。中斷處理程式就是通過這個32位掩碼來標記軟中斷的。
哪些時候會檢查軟中斷並處理?
從乙個硬體中斷**返回時。當do_irq()完成了i/o中斷的處理時或呼叫irq_exit()巨集時。
在ksoftirqd核心執行緒中。在linux核心中,每個cpu都有自己的ksoftirqd核心執行緒來輔助處理軟中斷(和tasklet),每個ksoftirqd核心執行緒都執行ksoftirqd()函式,這個函式實際上是在迴圈執行一些任務。當核心執行緒被喚醒時,就會檢查軟中斷掩碼並在必要時呼叫do_softirq()。
那些顯式檢查和執行待處理的軟中斷的**中,如網路字系統中
tasklet是利用軟中斷實現的一種下半部機制。tasklet能被動態地註冊或登出。tasklet是i/o驅動程式中實現下半部的首選方法。從上面的**可以看出,tasklet其實就是某種軟中斷。表中可以看到hi_softirq和tasklet_softirq的軟中斷就是用於tasklet的。幾個tasklet可以與同乙個軟中斷相關聯,每個tasklet執行自己的函式。這兩種軟中斷之間沒有真正的區別,只不過do_softirq()先執行hi_softirq的tasklet,後執行tasklet_softirq的tasklet。
tasklet由tasklet_struct結構表示,每個結構體單獨代表乙個tasklet。
結構體中的func成員是tasklet的處理程式(像軟中斷中的action一樣),data是他的唯一引數。
參考文獻
linux核心設計與實現
深入理解linux核心
推薦博文
下半部機制之軟中斷
軟中斷 softirq 是用軟體方式模擬硬體中斷的概念,實現巨集觀上的非同步執行效果。softirq是基本的下半部機制,需要互斥使用。一般很少直接使用。通常只用在少數效能比較關鍵的子系統中。它是可重入的,允許乙個softirq的不同例項可同時執行在不同的處理器上。軟中斷的 位於kernel soft...
中斷管理之下半部軟中斷
linux中斷管理中有個非常重要的設計理念就是上下半部機制 上半部就是硬體中斷管理 中斷設計為上下半部的原因如下 1.硬體中斷處理程式以非同步方式進行 它會打斷其他重要的 執行 因此為了避免被打斷的程式停止時間太長 硬體中斷處理程式必須盡快完成 2.硬體中斷處理程式通常在關閉中斷的情況下執行 關閉中...
例項 中斷的下半部分之 軟中斷
在linux中斷加入自已的軟中斷 軟硬體環境 linux 2.6.36 s3c2440 步驟如下 在軟中斷定義的列舉型別列表中加入自已的軟中斷號my softirq 具體到linux 2.6.36 include linux interrupt.h的第376行的列舉列表。其中已經有10項,在nr s...