中斷處理 上下半部機制

2021-06-17 19:01:29 字數 1080 閱讀 6223

首先需要了解一下中斷的概念:乙個「中斷」僅僅是乙個訊號,當硬體需要獲得處理器對它的關注時,就可以傳送這個訊號。核心維護了乙個中斷訊號線的登錄檔,該登錄檔類似於i/o埠的登錄檔。

模組在使用中斷前要先請求乙個中斷通道(或中斷請求irq),然後在使用後釋放該通道。用到的api就是request_irq()以及free_irq()。注意在呼叫request_irq()和free_irq()的時機最好是在裝置第一次開啟和最後一次關閉之後。

對於中斷處理例程來講,它的乙個典型的任務就是:如果中斷通知程序所等待的事件已經發生,比如新的資料到達就會喚醒在該裝置上休眠的程序。無論是快速還是慢速處理例程,程式設計師都應該編寫執行事件盡可能短的處理例程。如果需要執行乙個長時間的計算任務,做好的辦法就是使用上下半部處理機制,以便讓工作在更安全的時間裡排程計算任務。

上半部的功能是響應中斷。當中斷發生時,它就把裝置驅動程式中中斷處理例程的下半部掛到裝置的下半部執行佇列中去,然後繼續等待新的中斷到來。這樣一來,上半部的執行速度就會很快,它就可以接受更多它負責的裝置所產生的中斷了。上半部之所以快,是因為它是完全遮蔽中斷的,如果它沒有執行完,其他中斷就不能及時地處理,只能等到這個中斷處理程式執行完畢以後。所以要盡可能多的對裝置產生的中斷進行服務和處理,中斷處理程式就一定要快。

下半部的功能是處理比較複雜的過程。下半部和上半部最大的區別是可中斷,而上半部卻不可中斷。下半部幾乎完成了中斷處理程式所有的事情,因為上半部只是將下半部排到了它們所負責的裝置中斷的處理佇列中去,然後就不做其它的處理了。下半部所負責的工作一般是檢視裝置以獲得產生中斷的事件資訊,並根據這些資訊(一般通過讀裝置上的暫存器得來)進行相應的處理。下半部是可中斷的,所以在執行期間,如果其它裝置產生了中斷,這個下半部可以暫時的中斷掉,等到那個裝置的上半部執行完了,再回頭執行這個下半部。

這上面大多數都是我們在查閱資料和聽老師講課獲取的知識內容但是具體是如何實現的呢?

也許我們也知道tasklet和work_queue。知道這兩個是完成下半部的。在具體的過程中我們將如何實現呢?

此處就是通過建立工作佇列的方式我們把初始化的操作都放在irq之前完成,在irq_handler()中將具體的工作提交到工作佇列中。使用的api為queue_work()。具體的細節問題希望讀者能夠查閱資料自行完成。

中斷的上下半部

因為輸入類裝置的輸入都是非同步事件,因此一般使用中斷來處理和響應。當中斷處理程式比較長,而又希望優良的響應特性時,linux核心處理中斷的方案是 人為地將處理程式分為兩部分。1 為什麼要分上半部 top half,又叫頂半部 和下半部 bottom half,又叫底半部 2 下半部處理策略1 tas...

下半部機制之軟中斷

軟中斷 softirq 是用軟體方式模擬硬體中斷的概念,實現巨集觀上的非同步執行效果。softirq是基本的下半部機制,需要互斥使用。一般很少直接使用。通常只用在少數效能比較關鍵的子系統中。它是可重入的,允許乙個softirq的不同例項可同時執行在不同的處理器上。軟中斷的 位於kernel soft...

筆記 中斷,下半部

先弄清兩個概念,程序上下文和中斷上下文 處理器總處於以下狀態中的一種 核心態,執行於程序上下文,核心代表程序執行於核心空間 核心態,執行於中斷上下文,核心代表硬體執行於核心空間 使用者態,執行於使用者空間。使用者空間的應用程式,通過系統呼叫,進入核心空間。這個時候使用者空間的程序要傳遞很多變數 引數...