1. 程式人生 > >理解硬(軟)中斷的巢狀

理解硬(軟)中斷的巢狀

中斷基礎

關於中斷的概念,很多人還停留在書本上,我們結合實際的作業系統來理解。先給出硬中斷和軟中斷的介紹:

硬中斷:外設處理過程中產生的,通過硬體控制器通知cpu自己的狀態變化。

軟中斷:硬中斷應該很快完成,才能有快的響應,所以將一部分可以延遲的處理從硬中斷裡獨立出來,當硬中斷處理完之後再處理這部分,就是軟中斷。

下面,我們以linux為例,分析一下中斷的巢狀情況

硬中斷的巢狀

《深入理解linux核心》中講過,linux下的硬中斷處理是可以巢狀的,並且沒有優先順序。也就是說,一箇中斷可以打斷正在執行的中斷(同種中斷除外,後文會講)。無優先順序地支援硬中斷巢狀有兩個主要原因:短時間內接受更多的中斷,可以有大的裝置控制吞吐量;無優先順序可以簡化核心,提高移植性。

硬中斷的具體linux實現流程是:(參考linux kernel 4.0

硬中斷的彙編處理->do_IRQ->handle_irq->handle_edge_irq(handle_level_irq)->handle_irq_event->具體裝置的硬中斷處理

同種中斷不巢狀是通過設定該種中斷的資料結構的IRQD_IRQ_INPROGRESS標誌位來遮蔽(本cpu和其它cpu的同種中斷)的,置位表示已經在處理該種中斷了,同種中斷會判斷此標誌而退出,同時置上IRQS_PENDING標誌位表示此種中斷還需繼續處理。這個過程是不是很類似於軟中斷的防止巢狀的套路?我們(

計算機學習微信公眾號:jsj_xx)的理解是:它們本質是一樣的,只是硬中斷這裡防的是同種型別(即使是不同cpu上),而軟中斷那裡防的是所有型別(只在同一個cpu上,還記得軟中斷基於per-cpu的資料結構吧),但防範機制是一樣的

據此,我們可以推出硬中斷的最大的巢狀層數是:硬中斷的型別數(同時需要未設定IRQF_DISABLED標誌位,馬上講到)。

2009年開源社群已經開始討論預設設定IRQF_DISABLED標誌位(http://lwn.net/Articles/321663/):如果設定了IRQF_DISABLED,那麼該硬中斷不允許被打斷,也就禁止了巢狀。實際應用中,由於多佇列網絡卡(一個網絡卡不再僅僅產生一種中斷了,可能多達數十個!)會導致中斷棧溢位,故於2010年終於關閉硬中斷巢狀機制了,具體參考patch:e58aa3d2d0cc01ad8d6f7f640a0670433f794922(genirq: Run irqhandlers with interrupts disabled)


想想,有很多非常重要的事要做,是逐個做還是打斷式並行做?如果是人去做的話,肯定會選逐個做。機器也一樣?打斷式並行做導致記錄現場的儲存量過大而崩潰。。。

硬中斷的提速很重要,不管是拆分出軟中斷還是中斷執行緒化,都是希望硬中斷不要過多影響使用者程序(特別是實時程序),畢竟有些硬中斷和某些高優先順序使用者程序相比,其實並不重要。

軟中斷的巢狀

同種軟中斷不可以巢狀,但可以並行在不同cpu上,即使是同種型別。詳細講解請參考我們(計算機學習微信公眾號:jsj_xx)之前的《理解linux核心的軟中斷(上/下)》。

總結

簡潔地講解硬中斷和軟中斷的巢狀情況,硬中斷的目標很明確:要快,不能影響系統其它高優先順序程序。硬中斷的詳細細節(包括PIC/APIC/EDGE/LEVEL等)我們以後再。(純屬我們自己理解,如有不妥,還望指正)

關注我們(計算機學習微信公眾號:jsj_xx),原創技術文章,感悟計算機,透徹理解計算機!