為什麼需要中斷?
如果讓核心定期對裝置進行輪詢,以便處理裝置,那會做很多無用功,因為外設的處理速度一般慢於cpu,而cpu不能一直等待外部事件。所以能讓裝置在需要核心時主動通知核心,會是乙個聰明的方式,這便是中斷。
1. 中斷處理程式
在響應乙個特定中斷時,核心會執行乙個函式——中斷處理程式。中斷處理程式與其他核心函式的區別在於,中斷處理程式是被核心呼叫來響應中斷的,而它們執行於我們稱之為中斷上下文的特殊上下文中。
中斷處理程式就是普通的c**。特別之處在於中斷處理程式是在中斷上下文中執行的,它的行為受到某些限制:
1)不能向使用者空間傳送或接受資料
2)不能使用可能引起阻塞的函式
3)不能使用可能引起排程的函式
裝置驅動程式利用request_irq()註冊中斷處理程式,並啟用給定的中斷線。返回0表示成功,或者返回乙個錯誤碼。
解除安裝裝置驅動程式時,需要登出相應的中斷處理程式,並釋放中斷線,這時需要呼叫free_irq——如果在給定的中斷線上沒有中斷處理程式,則登出響應的處理程式,並禁用其中斷線。
我們期望讓中斷處理程式執行得快,並想讓它完成的工作量多,這兩個目標相互制約,如何解決——上下半部機制。
我們把中斷處理切為兩半。中斷處理程式是上半部——接受中斷,他就立即開始執行,但只有做嚴格時限的工作。能夠被允許稍後完成的工作會推遲到下半部去,此後,在合適的時機,下半部會被開終端執行。上半部簡單快速,執行時禁止一些或者全部中斷。下半部稍後執行,而且執行期間可以響應所有的中斷。這種設計可以使系統處於中斷遮蔽狀態的時間盡可能的短,以此來提高系統的響應能力。上半部只有中斷處理程式機制,而下半部的實現有軟中斷實現,tasklet實現和工作佇列實現。
我們用網絡卡來解釋一下這兩半。當網絡卡接受到資料報時,通知核心,觸發中斷,所謂的上半部就是,及時讀取資料報到記憶體,防止因為延遲導致丟失,這是很急迫的工作。讀到記憶體後,對這些資料的處理不再緊迫,此時核心可以去執行中斷前執行的程式,而對網路資料報的處理則交給下半部處理。
1) 如果乙個任務對時間非常敏感,將其放在中斷處理程式中執行;
2) 如果乙個任務和硬體有關,將其放在中斷處理程式中執行;
3) 如果乙個任務要保證不被其他中斷打斷,將其放在中斷處理程式中執行;
4) 其他所有任務,考慮放置在下半部執行。
軟中斷作為下半部機制的代表,是隨著smp(share memoryprocessor)的出現應運而生的,它也是tasklet實現的基礎(tasklet實際上只是在軟中斷的基礎上新增了一定的機制)。軟中斷一般是「可延遲函式」的總稱,有時候也包括了tasklet(請讀者在遇到的時候根據上下文推斷是否包含tasklet)。它的出現就是因為要滿足上面所提出的上半部和下半部的區別,使得對時間不敏感的任務延後執行,軟中斷執行中斷處理程式留給它去完成的剩餘任務,而且可以在多個cpu上並行執行,使得總的系統效率可以更高。它的特性包括:
a)產生後並不是馬上可以執行,必須要等待核心的排程才能執行。軟中斷不能被自己打斷,只能被硬體中斷打斷(上半部)。
b)可以併發執行在多個cpu上(即使同一型別的也可以)。所以軟中斷必須設計為可重入的函式(允許多個cpu同時操作),因此也需要使用自旋鎖來保護其資料結構。
tasklet是通過軟中斷實現的,所以它本身也是軟中斷。
軟中斷用輪詢的方式處理。假如正好是最後一種中斷,則必須迴圈完所有的中斷型別,才能最終執行對應的處理函式。顯然當年開發人員為了保證輪詢的效率,於是限制中斷個數為32個。
為了提高中斷處理數量,順道改進處理效率,於是產生了tasklet機制。
tasklet採用無差別的佇列機制,有中斷時才執行,免去了迴圈查表之苦。tasklet作為一種新機制,顯然可以承擔更多的優點。正好這時候smp越來越火了,因此又在tasklet中加入了smp機制,保證同種中斷只能在乙個cpu上執行。在軟中斷時代,顯然沒有這種考慮。因此同一種軟中斷可以在兩個cpu上同時執行,很可能造成衝突。
總結下tasklet的優點:
(1)無型別數量限制;
(2)效率高,無需迴圈查表;
(3)支援smp機制;
它的特性如下:
1)一種特定型別的tasklet只能執行在乙個cpu上,不能並行,只能序列執行。
2)多個不同型別的tasklet可以並行在多個cpu上。
3)軟中斷是靜態分配的,在核心編譯好之後,就不能改變。但tasklet就靈活許多,可以在執行時改變(比如新增模組時)。
上面我們介紹的可延遲函式執行在中斷上下文中(軟中斷的乙個檢查點就是do_irq退出的時候),於是導致了一些問題:軟中斷不能睡眠、不能阻塞。由於中斷上下文出於核心態,沒有程序切換,所以如果軟中斷一旦睡眠或者阻塞,將無法退出這種狀態,導致核心會整個僵死。但可阻塞函式不能用在中斷上下文中實現,必須要執行在程序上下文中,例如訪問磁碟資料塊的函式。因此,可阻塞函式不能用軟中斷來實現。但是它們往往又具有可延遲的特性。
上面我們介紹的可延遲函式執行在中斷上下文中,於是導致了一些問題,說明它們不可掛起,也就是說軟中斷不能睡眠、不能阻塞,原因是由於中斷上下文出於核心態,沒有程序切換,所以如果軟中斷一旦睡眠或者阻塞,將無法退出這種狀態,導致核心會整個僵死。因此,可阻塞函式不能用軟中斷來實現。但是它們往往又具有可延遲的特性。而且由於是序列執行,因此只要有乙個處理時間較長,則會導致其他中斷響應的延遲。為了完成這些不可能完成的任務,於是出現了工作佇列,它能夠在不同的程序間切換,以完成不同的工作。
linux中的軟中斷和工作佇列是中斷上下部機制中的下半部實現機制。
1.軟中斷一般是「可延遲函式」的總稱,它不能睡眠,不能阻塞,它處於中斷上下文,不能進城切換,軟中斷不能被自己打斷,只能被硬體中斷打斷(上半部),可以併發的執行在多個cpu上。所以軟中斷必須設計成可重入的函式,因此也需要自旋鎖來保護其資料結構。
2.工作佇列中的函式處在程序上下文中,它可以睡眠,也能被阻塞,能夠在不同的程序間切換,以完成不同的工作。
可延遲函式和工作佇列都不能訪問使用者的程序空間,可延時函式在執行時不可能有任何正在執行的程序,工作佇列的函式有核心程序執行,他不能訪問使用者空間位址。
為什麼需要PKI
為什麼需要pki 隨著電子商務的迅速發展,資訊保安已成為焦點問題之一,尤其是網上支付和網路銀行對資訊保安的要求顯得更為突出。為了能在網際網路上開展安全的電子商務活動,公開金鑰基礎設施 pki,public key infrastructure 逐步在國內外得到廣泛應用。我們是否真的需要pki,pki...
為什麼需要prototype
1.new object var newobj new object newobj.name keti newobj.color red newobj.changecolor function color 這種方法看上去很蠢,所以我們找到另一種方法 使用literal直接建立,看上去要優雅得多 2....
為什麼需要bootloader
受微控制器和arm7等小型cpu裝置程式設計思維的影響,開始對嵌入式linux和pc中存在bootloader bios的意義有了疑問 bootloader到底有沒有必要存在呢?答案是 大部分情況下是有必要的。首先,bootloader的作用是在硬體商店後執行的第一段軟體 也叫引導引導程式,是在作業...