linux中斷與下半部

2021-09-30 19:41:05 字數 1940 閱讀 6866

中斷:解決cpu和硬體速度差距太大問題,不能讓cpu等,也不能讓cpu輪詢,所以硬體好了給cpu發個訊號

硬體(控制器)-中斷控制器- cpu (中斷控制器在中斷線啟用(未被遮蔽)才發向cpu)

中斷:不需要與cpu時鐘同步,非同步,隨時可以來

異常(缺頁,0除):與cpu時鐘同步,同步,cpu產生,如系統呼叫就通過軟中斷(異常)陷入核心

中斷請求線(irq)/中斷線,一般都遮蔽中斷線,很少禁止本地(某cpu)中斷

中斷處理程式是裝置驅動程式(管理裝置的核心**)一部分,驅動程式需註冊其中斷處理程式

註冊:可能會指定(1 處理中斷時是否禁止所有其他中斷,野蠻行為,不好 2 共享中斷線,同一中斷線,多個裝置,多個程式共享)

解除安裝驅動時登出中斷處理程式,可能會釋放(禁用)中斷線(共享的情況下還有其他程式)

中斷處理程式:返回none(不是我裝置發的中斷)或handled(是我裝置發的中斷,處理了),無需重入,一般處理中都會禁掉當前中斷線,不會有其他cpu也接到此中斷

共享中斷舉例:依次呼叫各處理程式,處理程式內判斷是否是我的裝置(硬體提供支援,如狀態暫存器),不是退出(返回none)

中斷返回可能使用者搶占(need_resched)或核心搶占(need_resched,preempt_count)

中斷處理程式:立即執行,盡量快速執行完畢(但至少要通知硬體已收到中斷和一些必要的處理)

中斷上下文(無程序概念,無阻塞休眠,重新排程這些概念,不能在內呼叫一些可能阻塞的函式),可能巢狀(中斷處理中被其他中斷打斷,區分其和排程和阻塞的區別)

中斷處理程式執行時原先使用被中斷程序的核心棧,現在每個cpu有乙個中斷棧

下半部:合適時機執行,執行可稍後放的工作

舉例:網絡卡在中斷裡通知硬體並拷貝資料到記憶體,下半部處理資料。

下半部實現:軟中斷,tasklet(借助軟中斷),工作佇列

軟中斷:編譯期間靜態分配,用到9個(索引號/優先順序從0到8,0為高優先順序tasklets,5為正常優先順序tasklets,理論上限32,),只可能被中斷處理程式搶占,但其他cpu也可能執行軟中斷(甚至同一型別),所以需要同步機制。觸發(標記)後才會執行,一般在中斷處理程式裡標記

軟中斷執行時機:中斷處理程式返回,ksoftirqd核心執行緒,某些顯式檢查軟中斷**處。

對於時間要求嚴格,執行頻率高的應用,軟中斷執行最快(效能好),但就是同步考慮太麻煩。

一般很少直接用軟中斷,都用tasklet,同步考慮少

tasklet:動態註冊登出,同一tasklet不能同時在不同cpu上執行(免去很多同步機制),各種中斷處理都掛在乙個軟中斷上

ksoftirqd核心執行緒:處理軟中斷和tasklet,

問題:中斷太多,軟中斷頻繁被觸發,且軟中斷自我觸發(標記)導致使用者程序飢餓。

1本次軟中斷處理負責重新觸發的軟中斷,使用者程序飢餓

2 重新觸發的軟中斷放到下一次軟中斷執行時(多為下一次中斷返回時),重新觸發的軟中斷飢餓,即便系統空閒也不執行

最終方案:每個cpu乙個ksoftirqd核心執行緒( 如ksoftirqd/0),重新觸發的軟中斷由此核心執行緒執行(優先順序低),搶不過使用者執行緒,在系統空閒時執行

軟中斷和tasklet都執行在中斷上下文中,只不過執行時可響應中斷(沒有遮蔽中斷線或禁止本地中斷),但依然不能執行一些可能阻塞的函式等。

工作佇列:核心執行緒和使用者執行緒一樣,都是可排程實體,都執行在程序上下文中,只不過它一直執行在核心空間(執行核心**),且沒有記憶體描述符(借用)

工作佇列作為一種可執行阻塞函式的下半部機制,使用核心執行緒(工作者執行緒)執行其負責佇列中任務。

每個cpu有一預設工作者執行緒events/n(如events/0),當然你可以自己建立新的(其他型別的)工作者執行緒和佇列

工作佇列開銷最大(核心執行緒和上下文切換),但有睡眠需求也只能用它。

軟中斷和tasklet:可認為是非同步的,中斷了其他程序執行。某些時候需要禁止執行(如禁止本地執行)

工作佇列:同步的,排程發生才執行,不需要也很難禁止。

筆記 中斷,下半部

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

linux 中斷子系統 下半部

引用 搶占 softirq tasklet workqueue timer 中斷分成上下半部處理可以提高中斷的響應能力,在上半部處理完成後便將中斷開啟 通常上半部處理越快越好 這樣就可以響應其他中斷了,等到中斷退出的時候再進行下半部的處理。softirq是靜態的,不支援動態分配。支援的軟中斷型別,可...

linux中斷的上半部和下半部

本文 與linux中斷息息相關的乙個重要概念是linux中斷分為兩個半部 上半部 tophalf 和下半部 bottom half 上半部的功能是 登記中斷 當乙個中斷發生時,它進行相應地硬體讀寫後就把中斷例程的下半部掛到該裝置的下半部執行佇列中去。因此,上半部執行的速度就會很快,可以服務更多的中斷...