Linux作業系統 中斷 中斷處理 中斷上下部

2021-09-22 08:04:58 字數 3251 閱讀 5609

中斷響應過程:

中斷請求——>cpu響應中斷,清除中斷標誌——>保護現場——>確定中斷號,響應中斷服務程式——>中斷返回、恢復現場

1、中斷上半部:禁止響應其他中斷執行,下半部:開啟中斷執行

2、如果裝置使用中斷,相應的驅動程式就會註冊乙個中斷處理程式。

註冊中斷處理程式:request_irp():分配一條給定的中斷線。

中斷和重入:通常所有的中斷處理程式是無須重入的。中斷響應期間,相同中斷的中斷線在所有處理器上被遮蔽,但是其它中斷線都是開啟的。可以實現中斷巢狀。

3、共享的中斷處理程式(註冊標誌:irqf_shared):中斷處理程式可以共享中斷線,核心接受到乙個中斷的時候會依次呼叫在該中斷線上註冊的所有程式。因此中斷處理程式必須知道它是否應該為這個中斷響應負責。如果沒有產生與驅動程式相關的中斷,該處理程式立即退出。

4、程序上下文【核心代表程序執行(執行系統呼叫或者執行核心執行緒)】可以睡眠,可以發生程序排程,中斷上下文不能睡眠。

5、控制中斷系統

通過禁止中斷,可以確保某個中斷處理程式不會搶占當前的**,禁止中斷可以禁止核心搶占,不管是禁止中斷還是禁止核心搶占,都沒有提供機制來防護來自其他處理器的併發訪問。linux核心支援多處理器,因此核心**需要獲取某種鎖來防止其他處理器對資料的併發訪問。獲取這些鎖的同時伴隨著禁止本地中斷。鎖提供保護機制,防止其他處理器併發訪問。

6、下半部和退後執行的工作:通常下半部在中斷處理程式返回之後立馬就會執行,下半部執行的關鍵在於當他們執行的時候允許響應中斷。

7、下半部的實現機制:

(1) bottom half (bh):現在不使用;(2)任務佇列(效能瓶頸,被工作佇列替代)

(3)軟中斷:是一組靜態定義的下半部介面,有32個,可以在所有處理器上同時執行,即使兩個型別相同也可以,要求可重入。(效能好,少用)【2.6.34核心已經使用9個】【中斷上下文

1:乙個軟中斷不會搶占另乙個軟中斷,軟中斷只能被中斷程式打斷,可以響應中斷,但是不能休眠。

2:靜態註冊軟中斷,和核心一起編譯——>觸發軟中斷,中斷處理程式返回之前會觸發軟中斷,以便在稍後執行

3:軟中斷響應執行時機:硬體中斷**返回處、ksoftirq核心執行緒(每個處理器有乙個)中、顯示的檢查和執行軟中斷的**中

4:軟中斷保留給系統中對時間要求最嚴格的的以及最重要的下半部使用。

5:如果同乙個軟中斷被觸發,另外乙個處理器可以同時執行其處理程式,這意味著任何共享資料都需要嚴格保護。

//軟中斷註冊函式

open_softirq(int index, void (*action)(struct softirq_action *));

//軟中斷觸發

raise_softirq(int index);

所有的軟中斷被存放在乙個靜態陣列中,陣列的每乙個元素都是乙個軟中斷,陣列下表就是優先順序。

static struct softirq_action softirq_vec[nr_softirqs];
軟中斷的過程,與硬體中斷唯一不同 的地方是從中斷標記到中斷服務程式的對映過程。在cpu的硬體中斷發生之後,cpu需要將硬體中斷請求通過向量表對映成具體的服務程式,這個過程是硬體自 動完成的,但是軟中斷不是,其需要守護執行緒去實現這一過程,這也就是軟體模擬的中斷,故稱之為軟中斷。

(4)tasklet:基於軟中斷實現的靈活性強的動態建立的下半部實現機制,不同型別可以在不同處理器同時執行,相同型別不能同時執行(不需要設計為可重入)。(易用,效能較好,滿足普通需求)【中斷上下文

被啟用的tasklet:包需要排程的tasklet存放在每個處理器都有兩個tasklet鍊錶中,tasklet_vec 和tasklet_hi_vec,鍊錶的每個元素就是 struct tasklet_struct。【啟用函式 tasklet_schedule() 】

do_softirq() 函式會下乙個時機排程,並執行上述啟用的函式。

所有的tasklet都通過重複呼叫 hi_softirq和tasklet_softirq這兩個軟中斷實現。

引入tasklet,最主要的是考慮支援smp,提高smp多個cpu的利用率;兩個相同的tasklet決不會同時執行。tasklet可以理解為softirq的派生,所以它的排程時機和軟中斷一樣。對於核心中需要延遲執行的多數任務都可以用tasklet來完成,由於同類tasklet本身已經進行了同步保護,所以使用tasklet比軟中斷要簡單的多,而且效率也不錯。tasklet把任務延遲到安全時間執行的一種方式,在中斷期間執行,即使被排程多次,tasklet也只執行一次,不過tasklet可以在smp系統上和其他不同的tasklet並行執行。在smp系統上,tasklet還被確保在第乙個排程它的cpu上執行,因為這樣可以提供更好的快取記憶體行為,從而提高效能。

ksoftirq執行緒:當核心出現大量的軟中斷和tasklet時,這些核心執行緒輔助處理。

引入該核心執行緒的原因:方案1:只要還有已經觸發並等待處理的軟中斷,本次執行應當負責執行,當軟中斷重複自己觸發軟中斷,會一直執行軟中斷,會導致使用者程序飢餓。方案2:本次執行不負責新觸發的中斷,被安排到下一次的do_softirq()中,但是也會導致新觸發的軟中斷不能馬上處理。

折中:不會立即處理新觸發的軟中斷,同時,在出現大量的軟中斷的時候,啟用一組核心執行緒來處理這些負載。這些核心執行緒執行在最低優先順序上。

(5)工作佇列:可以把核心任務推後,交給乙個核心執行緒處理。【程序上下文

如果推後執行的任務需要睡眠,那麼就選擇工作佇列。另外,如果需要用乙個可以重新排程的實體來執行你的下半部處理,也應該使用工作佇列。它是唯一能在程序上下文執行的下半部實現的機制,也只有它才可以睡眠。這意味著在需要獲得大量的記憶體時、在需要獲取訊號量時,在需要執行阻塞式的i/o操作時,它都會非常有用。work queue造成的開銷最大,因為它要涉及到核心執行緒甚至是上下文切換。這並不是說work queue的低效,但每秒鐘有數千次中斷,就像網路子系統時常經歷的那樣,那麼採用其他的機制可能更合適一些。 儘管如此,針對大部分情況工作佇列都能提供足夠的支援。如果推後執行的任務需要睡眠,那麼就選擇工作佇列。如果推後執行的任務不需要睡眠,那麼就選擇tasklet。

工作佇列子系統提供了乙個or組預設的核心執行緒來處理推後執行的工作。驅動程式也可以建立乙個專用的工作者核心執行緒。不過一般不建議。

系統存在多種工作者執行緒,每種工作者執行緒在每個處理器上有乙個工作者執行緒,每個工作者執行緒有乙個工作佇列。

預設核心只有event這一種型別的工作者執行緒。

作業系統的中斷處理

pushq rax n t pushq rax n t pushq es,rax n t pushq rax n t pushq 上面的這段彙編 的巨集定義就是在執行中斷程式的時候呼叫的現場保留的操作,和異常的現場保留是類似的 不同的是,在異常中是處理器產生的任務暫停,而在中斷中是外部裝置產生的任務...

作業系統 中斷

寫在前面 參考中斷 中斷是指cpu對i o裝置發來的中斷訊號的一種響應。cpu暫停正在執行的程式,保留cpu環境後,自動地去執行該i o裝置的中斷處理程式。執行完後,再回到斷點,繼續執行原來的程式。i o裝置可以是字元裝置,也可以是塊裝置 通訊裝置。由於中斷時由外部裝置引起的,故又稱外中斷。在作業系...

作業系統 中斷

中斷是指計算機在執行期間,系統內發生任何非尋常的或非預期的急需處理事件,使得cpu暫時中斷當前正在執行的程式而轉去執行相應的事件處理程式,待處理完畢後又返回原來被中斷處繼續執行或排程新的程序執行的過程。引起中斷發生的事件被稱為中斷源。中斷源向cpu發出的請求中斷處理訊號稱為中斷請求,而cpu收到中斷...