什麼是軟中斷機制?
linux中的軟中斷機制用於系統中對時間要求最嚴格以及最重要的中斷下半部進行使用。在系統設計過程中,大家都清楚中斷上下文不能處理太多的事情,需要快速的返回,否則很容易導致中斷事件的丟失,所以這就產生了乙個問題:中斷發生之後的事務處理由誰來完成?在前後台程式中,由於只有中斷上下文和乙個任務上下文,所以中斷上下文觸發事件,設定標記位,任務上下文迴圈掃瞄標記位,執行相應的動作,也就是中斷發生之後的事情由任務來完成了,只不過任務上下文採用掃瞄的方式,實時性不能得到保證。在linux系統和windows系統中,這個不斷迴圈的任務就是本文所要講述的軟中斷daemon。在windows中處理耗時的中斷事務稱之為中斷延遲處理,在linux中稱之為中斷下半部,顯然中斷上半部處理清中斷之類十分清閒的動作,然後在退出中斷服務程式時觸發中斷下半部,完成具體的功能。
在linux中,中斷下半部的實現基於軟中斷機制。所以理清楚軟中斷機制的原理,那麼中斷下半部的實現也就非常簡單了。通過上述的描述,大家也應該清楚為什麼要定義軟中斷機制了,一句話就是為了要處理對時間要求苛刻的任務,恰好中斷下半部就有這樣的需求,所以其實現採用了軟中斷機制。
軟中斷機制實現原理
軟中斷機制的實現原理如下圖所示:
構成軟中斷機制的核心元素包括:
1、 軟中斷狀態暫存器soft interrupt state(irq_stat)
2、 軟中斷向量表(softirq_vec)
3、 軟中斷守護daemon
軟中斷的工作工程模擬了實際的中斷處理過程,當某一軟中斷時間發生後,首先需要設定對應的中斷標記位,觸發中斷事務,然後喚醒守護執行緒去檢測中斷狀態暫存器,如果通過查詢發現某一軟中斷事務發生之後,那麼通過軟中斷向量表呼叫軟中斷服務程式action()。這就是軟中斷的過程,與硬體中斷唯一不同的地方是從中斷標記到中斷服務程式的對映過程。在cpu的硬體中斷發生之後,cpu需要將硬體中斷請求通過向量表對映成具體的服務程式,這個過程是硬體自動完成的,但是軟中斷不是,其需要守護執行緒去實現這一過程,這也就是軟體模擬的中斷,故稱之為軟中斷。
乙個軟中斷不會去搶占另乙個軟中斷,只有硬體中斷才可以搶占軟中斷,所以軟中斷能夠保證對時間的嚴格要求。
在linux中最多可以註冊32個軟中斷,目前系統用了6個軟中斷,他們為:定時器處理、scsi處理、網路收發處理以及tasklet機制,這裡的tasklet機制就是用來實現下半部的,
描述軟中斷的核心資料結構為中斷向量表,其定義如下:
struct softirq_action
void (*action)(struct softirq_action *); /* 軟中斷服務程式 */
void *data; /* 服務程式輸入引數 */
軟中斷守護daemon是軟中斷機制的實現核心,其實現過程也比較簡單,通過查詢軟中斷狀態irq_stat來判斷事件是否發生,如果發生,那麼對映到軟中斷向量表,呼叫執行註冊的action函式就可以了。從這一點分析可以看出,軟中斷的服務程式的執行上下文為軟中斷daemon。在linux中軟中斷daemon執行緒函式為do_softirq()。
觸發軟中斷事務通過raise_softirq()來實現,該函式就是在中斷關閉的情況下設定軟中斷狀態位,然後判斷如果不在中斷上下文,那麼直接喚醒守護daemon。
常用的軟中斷函式列表如下:
1、 open_softirq,註冊乙個軟中斷,將軟中斷服務程式註冊到軟中斷向量表。2、 raise_softirq,設定軟中斷狀態bitmap,觸發軟中斷事務。
tasklet機制實現分析
tasklet為乙個軟中斷,考慮到優先順序問題,分別占用了向量表中的0號和5號軟中斷。tasklet機制的實現原理如下圖所示:
當tasklet的軟中斷事件發生之後,執行tasklet-action的軟中斷服務程式,該服務程式會掃瞄乙個tasklet的任務列表,執行該任務中的具體服務程式。在這裡舉乙個例子加以說明:
當使用者讀寫usb裝置之後,發生了硬體中斷,硬體中斷服務程式會構建乙個tasklet_struct,在該結構中指明了完成該中斷任務的具體方法函式(下半部執行函式),然後將tasklet_struct掛入tasklet的tasklet_struct鍊錶中,這一步可以通過tasklet_schedule函式完成。最後硬體中斷服務程式退出並且cpu開始排程軟中斷daemon,軟中斷daemon會發現tasklet發生了事件,其會執行tasklet-action,然後tasklet-action會掃瞄tasklet_struct鍊錶,執行具體的usb中斷服務程式下半部。這就是應用tasklet完成中斷下半部實現的整個過程。
linux中的tasklet實現比較簡單,其又封裝了乙個重要資料結構tasklet_struct,使用tasklet主要函式列表如下:
1、 tasklet_init,初始化乙個tasklet_struct,當然可以採用靜態初始化的方法,巨集為:declare_tasklet。
2、 tasklet_schedule,排程乙個tasklet,將輸入的tasklet_struct新增到tasklet的鍊錶中。
linux中的軟中斷機制就是模擬了硬體中斷的過程,其設計思想完全可以在其他嵌入式os中得以應用。
Linux中軟中斷機制分析
什麼是軟中斷機制?linux中的軟中斷機制用於系統中對時間要求最嚴格以及最重要的中斷下半部進行使用。在系統設計過程中,大家都清楚中斷上下文不能處理太多的事情,需要快速的返回,否則很容易導致中斷事件的丟失,所以這就產生了乙個問題 中斷發生之後的事務處理由誰來完成?在前後台程式中,由於只有中斷上下文和乙...
網路處理的軟中斷機制分析
首先需要介紹的就是netif rx 在net core dev.c中定義 函式,這個函式在網絡卡驅動程式與linux核心之間建立了一道橋梁,將網絡卡接收上來的資料報 sk buff形式 插入核心維護的接收緩衝區佇列當中 int netif rx struct sk buff skb if queue...
網路處理的軟中斷機制分析
核心預設軟中斷機制分析 process backlog 首先需要介紹的就是 netif rx 在net core dev.c 中定義 函式,這個函式在網絡卡驅動程式與 linux 核心之間建立了一道橋梁,將網絡卡接收上來的資料報 sk buff 形式 插入核心維護的接收緩衝區佇列當中 int net...