Linux中斷研究

研究linux系統,不論是作驅動、協議棧仍是進程調度等等,都離不開中斷。這說明,要想編寫正確的linux代碼,不瞭解中斷是不行的。linux

話說曾幾什麼時候,在大學的課堂裏,老師口若懸河的講解中斷,說中斷能夠嵌套,說中斷有優先級,那麼linux操做系統是否是中斷嵌套?是否是按優先級嵌套?函數

其實你們應該能夠猜到了,並不徹底是的。由於老師講的是理論,linux是現實,這二者是很難相同的。就像小時候要當科學家,結果長大了發現本身每天在搬磚。spa

如今回到正軌上來,經過下面幾個問題的講解,你們就能夠對linux的中斷有個總體上的瞭解。操作系統

硬件平臺:x86.net

操做系統版本:linux-2.6.24blog

1.什麼時硬中斷,什麼是軟中斷?進程

硬中斷:是由與系統相連的外設(好比:網卡、硬盤)自動產生的。主要是用來通知操做系統外設狀態的變化。好比當網卡收到數據包的時候,就會發出一箇中斷。get

軟中斷:咱們知道,爲了知足實時系統的要求,中斷處理應該是越快越好。linux爲了實現這個特色,當中斷髮生的時候,硬中斷處理那些短期就能夠完成的工做,而將那些處理時間比較長的工做,放到中斷以後來完成,也就是軟中斷中來完成。it

2.不一樣的硬中斷是否能夠嵌套?相同的硬中斷是否能夠嵌套,以及是否按優先級嵌套?硬中斷最多可能嵌套幾級?event

Linux下硬中斷是能夠嵌套的,可是沒有優先級的概念,也就是說任何一個新的中斷均可以打斷正在執行的中斷,可是同種中斷不會打斷同種中斷的執行。

可是並非全部的中斷都是能夠被打斷的,這須要看註冊的中斷函數是否設置了IRQF_DISABLED,若是設置了IRQF_DISABLED,那麼硬中斷處理的時候是不容許被打斷的,不然是容許被打斷的。Peter Zijlstra在2009.3的一個討論中關於IRQF_DISABLED的使用問題(詳見http://lwn.net/Articles/321663/)。


從代碼的角度上來講中斷嵌套發生的位置:

硬件中斷-->do_IRQ-->handle_IRQ_event-->handler。 在硬件中斷到handle_event_irq之間,因爲發生中斷的時候CPU會自動屏蔽中斷,因此在這中間是不會發生中斷嵌套的,可是在handle_event_irq中,可能會從新開啓中斷,也就是說在handler中是能夠發生中斷嵌套的。

同種中斷不會嵌套的實現:

linux經過一個標誌位IRQ_INPROGRESS來實現。當中斷類型A的一箇中斷A1處理的時候,linux會在do_IRQ中,handle_IRQ_event以前,置位A類型中斷的IRQ_INPROGRESS位。當A1中斷在handle_IRQ_event中被同種類型的中斷A2到達,會調用do_IRQ,而後發現A類型中斷的IRQ_INPROGRESS,就會置位IRQ_PENDING後返回,不會嵌套執行。

因爲同種類型的中斷不會嵌套,因此最多可能的嵌套級數,就是未設置IRQF_DISABLED中斷類型的個數。(是否還有其餘的限制,沒有詳細的研究)

3.不一樣的軟中斷是否能夠嵌套?相同的軟中斷是否能夠嵌套?

軟中斷的調用是經過do_softirq()來激活的。

同種類型的軟中斷,不能夠嵌套執行。可是不一樣的CPU上,能夠同時運行相同類型的軟中斷。

4.軟中斷在什麼時間點被調度?

(1)內核顯示的容許軟中斷的時候 local_bh_enable

(2)irq_exit()的時候

(3)ksoftirqd進程被喚醒的時候

(4)其餘可能的地方(這裏沒有詳細的追究)

原文:http://blog717171.blog.163.com/blog/static/2506031112015101511126920/

相關文章
相關標籤/搜索