研究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/