Linux核心 之 中斷

2021-10-05 20:17:34 字數 2108 閱讀 3068

中斷處理函式所作的第一件事情是什麼?

答案是遮蔽中斷,所以要遮蔽中斷,是因為新的中斷會再次呼叫中斷處理函式,導致原來中斷處理現場的破壞。因為中斷,它是把原來的上下文都存起來,如果是多級中斷的話,它需要存多級的上下文,除非linux能存多級上下文,感覺是能多存的。如果只能存一級,那必然是要遮蔽中斷,不然上下文就會覆蓋丟失。

另外,既然遮蔽了,就會有新的問題->中斷丟失,解決方法就是將中斷函式與中斷接收區分開,中斷函式另開乙個執行緒做,那麼中斷接收馬上返回,這樣就不會中斷丟失(否則你的中斷請求多頻繁啊?那不可能)這樣是多執行緒機才會實現對不對,linux就是多執行緒的。或者怎麼說呢,我們把系統和其他函式叫做主程序,中斷處理叫做中斷程序。

我們再仔細了解一下核心執行原理吧:我們確定這裡就乙個cpu,每次只能執行一條彙編**,那麼,核心就是乙個由interrupt驅動的程式。那麼乙個使用者程式執行的時候,linux就在記憶體裡呆著,等著乙個中斷的到來(往往是程式的乙個時間片,或者其他中斷)。在這個中斷的處理過程中,來做「排程」。

有個id號為0的程序,迴圈呼叫puase()函式,這個函式可以讓cpu休息,呼叫電源管理,給 cpu降頻。而puase()又會呼叫schedule()函式,就是休息的時候也不忘警惕,schedule()函式會檢查是否有能用的程序,有就排程,沒有就又返回,然後再puase()。0 號程序並不負責排程其它程序。它也會呼叫 scheduler。而且 scheduler 還可以被時鐘中斷調起的。

linux中斷下半部處理有三種方式:軟中斷、tasklet、工作佇列。

中斷處理過程。中斷接收在遮蔽中斷的情況下完成;中斷處理在時能中斷的情況下完成,這部分被稱為中斷下半部。作為乙個作業系統顯然不能任由每個中斷都各自為政,統一管理是必須的。

軟中斷用輪詢的方式處理。假如正好是最後一種中斷,則必須迴圈完所有的中斷型別,才能最終執行對應的處理函式。顯然當年開發人員為了保證輪詢的效率,於是限制中斷個數為32個。隨著中斷數的不停增加,軟中斷不夠用了,為了提高中斷處理數量,順道改進處理效率,於是產生了tasklet機制。tasklet採用無差別的佇列機制,有中斷時才執行,免去了迴圈查表之苦。

由於中斷程式是序列執行,因此只要有乙個處理時間較長,則會導致其他中斷響應的延遲。為了能並行處理中斷,於是出現了工作佇列。工作佇列是一組核心執行緒。多個中斷可以放在乙個執行緒中,也可以每個中斷分配乙個執行緒。

由於中斷會打斷核心中程序的正常排程執行,所以要求中斷服務程式盡可能的短小精悍;但是在實際系統中,當中斷到來時,要完成工作往往進行大量的耗時處理。因此期望讓中斷處理程式執行得快,並想讓它完成的工作量多,這兩個目標相互制約,誕生——頂/底半部機制。這種設計可以使系統處於中斷遮蔽狀態的時間盡可能的短,以此來提高系統的響應能力。頂半部只有中斷處理程式機制,而底半部的實現有軟中斷,tasklet和工作佇列實現。

軟中斷作為下半部機制的代表,是隨著smp(share memory processor)的出現應運而生的,它也是tasklet實現的基礎(tasklet實際上只是在軟中斷的基礎上新增了一定的機制)。軟中斷一般是「可延遲函式」的總稱,有時候也包括了tasklet(請讀者在遇到的時候根據上下文推斷是否包含tasklet)。它的出現就是因為要滿足上面所提出的上半部和下半部的區別,使得對時間不敏感的任務延後執行,軟中斷執行中斷處理程式留給它去完成的剩餘任務,而且可以在多個cpu上並行執行,使得總的系統效率可以更高。

軟中斷用輪詢的方式處理。可能就是,每隔一段時間,32個項都要查一遍,而tasklet維護了乙個佇列,只查第乙個就行,而工作佇列由於有多個執行緒,可以一次查好幾個。

可延遲函式執行在中斷上下文中,則它們不可掛起,也就是說軟中斷不能睡眠、不能阻塞,原因是由於中斷上下文出於核心態,沒有程序切換,所以如果軟中斷一旦睡眠或者阻塞,將無法退出這種狀態,導致核心會整個僵死。工作佇列則能執行在程序上下文,它將工作給乙個核心執行緒,作為中斷守護執行緒來使用。多個中斷可以放在乙個執行緒中,也可以每個中斷分配乙個執行緒。我們用結構體workqueue_struct表示工作者執行緒,工作者執行緒是用核心執行緒實現的。而工作者執行緒是如何執行被推後的工作——有這樣乙個鍊錶,它由結構體work_struct組成,而這個work_struct則描述了乙個工作,一旦這個工作被執行完,相應的work_struct物件就從鍊錶上移去,當鍊表上不再有物件時,工作者執行緒就會繼續休眠。

軟中斷和tasklet執行在中斷上下文,工作佇列執行在程序上下文。如果需要休眠則選擇工作佇列,否則選擇tasklet;如果對效能要求較高則選擇軟中斷。

Linux核心開發之中斷處理

一 概念 1 外設的處理速度一般慢於cpu。2 cpu不能一直等待外部事件。所以裝置必須有一種方法來通知cpu它的工作進度,這種方法就是中斷。二 中斷實現 在linux驅動程式中,為裝置實現乙個中斷包含兩個步驟 1 向核心註冊中斷 2 實現中斷處理函式 三 中斷處理子系統 1 根據中斷號找到正確的中...

Linux核心開發之中斷與時鐘 三

晚上7點10分.小濤哥,這章不是叫linux裝置驅動程式之中斷與時鐘,前邊你講了中斷,還給了我很多模版,我都看懂了,這次是不是要開始講時鐘了.真聰明,越來越喜歡你這聰明的樣子了,說的不錯,今天就要開始乙個新的模組 核心時鐘 我很少誇人,為啥今天誇她呢了,呵呵.定時器,意思大家都明白,我就不說了,要是...

Linux核心原始碼閱讀之中斷(簡)

本文對linux2.4.0中中斷機制從原始碼層面進行簡要介紹,閱讀需要有一定基礎,詳細版本請參考這裡。這裡主要介紹以下幾個部分 主要是設定中斷向量表中中斷服務的型別,服務程式的入口位址,dpl等。1.1 trap init 初始化系統保留的中斷向量,從0x00到0x1f共36個 init irq 初...