copy from:
研究linux系統,不管是做驅動、協議棧還是程序排程等等,都離不開中斷。這說明,要想編寫正確的linux**,不了解中斷是不行的。
話說曾幾何時,在大學的課堂裡,老師滔滔不絕的講解中斷,說中斷可以巢狀,說中斷有優先順序,那麼linux作業系統是不是中斷巢狀?是不是按優先順序巢狀?
其實大家應該可以猜到了,並不完全是的。因為老師講的是理論,linux是現實,這兩者是很難相同的。就像小時候要當科學家,結果長大了發現自己天天在搬磚。
現在回到正軌上來,通過下面幾個問題的講解,大家就可以對linux的中斷有個整體上的了解。
硬體平台:x86
作業系統版本:linux-2.6.24
1.什麼時硬中斷,什麼是軟中斷?
硬中斷:是由與系統相連的外設(比如:網絡卡、硬碟)自動產生的。主要是用來通知作業系統外設狀態的變化。比如當網絡卡收到資料報的時候,就會發出乙個中斷。
軟中斷:我們知道,為了滿足實時系統的要求,中斷處理應該是越快越好。linux為了實現這個特點,當中斷發生的時候,硬中斷處理那些短時間就可以完成的工作,而將那些處理時間比較長的工作,放到中斷之後來完成,也就是軟中斷中來完成。
2.不同的硬中斷是否可以巢狀?相同的硬中斷是否可以巢狀,以及是否按優先順序巢狀?硬中斷最多可能巢狀幾級?
linux下硬中斷是可以巢狀的,但是沒有優先順序的概念,也就是說任何乙個新的中斷都可以打斷正在執行的中斷,但是同種中斷不會打斷同種中斷的執行。
但是並不是所有的中斷都是可以被打斷的,這需要看註冊的中斷函式是否設定了irqf_disabled,如果設定了irqf_disabled,那麼硬中斷處理的時候是不允許被打斷的,否則是允許被打斷的。peter zijlstra在2009.3的乙個討論中關於irqf_disabled的使用問題(詳見
從**的角度上來說中斷巢狀發生的位置:
硬體中斷-->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)其他可能的地方(這裡沒有詳細的追究)
x86中斷架構
x86計算機的 cpu 為中斷只提供了兩條外接引腳 nmi 和 intr。1.可程式設計中斷控制器8259a 8259a 只適合單 cpu 的情況。每個cpu都有乙個本地apic,所有本地apic連線到io apic。主要是收集來自 i o 裝置的 interrupt 訊號且在當那些裝置需要中斷時傳...
x86中斷(一) 中斷分類
一 中斷分類 x86系統支援256個中斷源,每個中斷源使用0 255數字標識,該標識稱作中斷向量號 即cpu中斷源的中斷號,要與外部中斷的中斷號irq n相區別 cpu通過獲取中斷向量號識別中斷源。256個中斷源可以分為 其中 1 內部中斷 由cpu內部事件及執行軟中斷指令產生,由除法中斷 溢位中斷...
ARM和x86的區別
cpu的指令集從主流的體系結構上分為精簡指令集 risc 和複雜指令集 cisc 嵌入式系統中的主流處理器 arm處理器,所使用的就是精簡指令集。而桌面領域的處理器大部分使用的是複雜指令集,比如intel的x86系列處理器。我們把arm處理器所使用的指令集稱為arm指令集,把x86處理器所使用的指令...