【Linux】硬中斷和軟中斷的區別

中斷

中斷本質上是-一種特殊的電信號,由硬件設備發向處理器。從物理學的角度看,中斷是一種電信號,由硬件設備生成,並直接送入中斷控制器的輸入引腳中一中斷控制器是個簡單的電子芯片,其作用是將多路中斷管線,採用複用技術只通過一個和處理器相連接的管線與處理器通信。當接收到一箇中斷後,中斷控制器會給處理器發送一個電信號。處理器一經檢測到此信號,便中斷自己的當前工作轉而處理中斷。此後,處理器會通知操作系統已經產生中斷,這樣,操作系統就可以對這個中斷進行適當地處理了。

中斷處理程序

在響應一個特定中斷的時候,內核會執行-一個函數,該函數叫做中斷處理程序(interrupthandler)或中斷服務例程( interrupt service routine, ISR)。產生中斷的每個設備都有一個相應的中斷處理程序。例如,由一個函數專門處理來自系統時鐘的中斷,而另外一個函數專門處理由鍵盤產生的中斷。一個設備的中斷處理程序是它設備驅動程序的一部分——設備驅動程序是用於對設備進行管理的內核代碼。Linux中,中斷處理程序就是簡單的C語言函數,只不過這些函數必須按照特定的類型聲明,以便內核能夠以標準的方式傳遞處理程序的信息,在其他方面,它們與一般的函數別無二致。中斷處理程序與其他內核函數的真正區別在於中斷處理程序是被內核調用來響應中斷的,而它們運行於我們稱之爲中斷上下文的特殊上下文中。中斷可能隨時發生,因此中斷處理程序也就隨時可能執行。所以必須保證中斷處理程序能夠快速執行,這樣才能保證儘可能快地恢復中斷代碼的執行。

上半部分和下半部分

中斷處理程序是上半部(tophalf)——接收到一箇中斷,它就立即開始執行,但只做有嚴格時限的工作,例如對接收的中斷進行應答或復位硬件,這些工作都是在所有中斷被禁止的情況下完成的。能夠被允許稍後完成的工作會推遲到下半部分去(bottomhalf)。此後,在合適的時機,下半部會被開中斷執行。

舉例
讓我們考察一下上半部和下半部分割的例子,還是以我們的老朋友—— 網卡作爲實例。當網卡接收來自網絡的數據包時,需要通知內核數據包到了。網卡需要立即完成這件事,從而優化網絡的吞吐量和傳輸週期,以避免超時。因此,網卡立即發出中斷:嗨,內核,我這裏有最新數據包了。內核通過執行網卡已註冊的中斷處理程序來做出應答。中斷開始執行,通知硬件,拷貝最新的網絡數據包到內存,然後讀取網卡更多的數據包。這些都是重要、緊迫而又與硬件相關的工作。內核通常需要快速的拷貝網絡數據包到系統內存,因爲網卡上接收網絡數據包的緩存大小固定,而且相比系統內存也要小得多。所以上述拷貝動作一旦被延遲,必然造成緩存溢出——進入的網絡包占滿了網卡的緩存,後續的入包只能被丟棄。當網絡數據包被拷貝到系統內存後,中斷的任務算是完成了這時它將控制權交還給系統被中斷前原先運行的程序。處理和操作數據包的其他工作在隨後的下半部中進行。

硬中斷

由與系統相連的外設(比如網卡、硬盤)自動產生的。主要是用來通知操作系統系統外設狀態的變化。比如當網卡收到數據包的時候,就會發出一箇中斷。我們通常所說的中斷指的是硬中斷(hardirq)。

軟中斷:

軟中斷是一組靜態定義的下半部接口,有32個,可以在所有處理器上同時執行——即使兩個類型相同也可以。可是,使用軟中斷需要特別小心,因爲兩個相同的軟中斷有可能同時被執行。此外,軟中斷還必須在編譯期間就進行靜態註冊。
軟中斷是一種推後執行的機制,定時器,網卡的數據的處理是很典型的軟中斷,這個和中斷向量表裏的中斷是完全不一樣的,以網絡數據的處理爲例,當網卡接到一個數據包後,其中斷處理程序只是把數據複製到緩衝區,然後就告訴網卡,你可以再傳數據給我了,也就是中斷返回,但在此之前,網卡的中斷處理程序要置一個標誌位,告訴操作系統有事要做,這個事就是軟中斷。

倆者區別:

  • 硬中斷是由外部事件引起的因此具有隨機性和突發性;軟中斷是執行中斷指令產生的,無外部施加中斷請求信號,因此中斷的發生不是隨機的而是由程序安排好的。
  • 硬中斷的中斷響應週期,CPU需要發中斷回合信號(NMI不需要),軟中斷的中斷響應週期,CPU不需發中斷回合信號
  • 硬中斷的中斷號是由中斷控制器提供的(NMI硬中斷中斷號系統指定爲02H);軟中斷的中斷號由指令直接給出,無需使用中斷控制器。
  • 硬中斷是可屏蔽的(NMI硬中斷不可屏蔽),軟中斷不可屏蔽
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章