天天看點

《Linux核心設計與實作》筆記:第七章中斷和中斷處理1、關于中斷2、關于異常3、關于中斷處理程式4、關于上半部和下半部的對比5、關于中斷上下文

文章目錄

  • 1、關于中斷
  • 2、關于異常
  • 3、關于中斷處理程式
  • 4、關于上半部和下半部的對比
  • 5、關于中斷上下文

1、關于中斷

中斷使得硬體得以通知給處理器。例如:當你敲擊鍵盤的時候,鍵盤控制器會發送一個中斷,通知作業系統有按鍵按下。

中斷本質是一種特殊的電信号,由硬體裝置發送給處理器。處理器收到中斷後,會馬上向作業系統反映此信号的到來,然後就由作業系統負責處理這些新到來的資料。

核心随時可能因為新到來的中斷而被打斷。不同的裝置對應的中斷不同,而每個中斷都通過一個唯一的數字标志。是以,來自鍵盤的中斷就有别于來自硬碟的中斷,進而使得作業系統能夠對中斷進行區分,并指導哪個硬體裝置産生了哪個中斷。這樣,作業系統才能給不同的中斷提供對應的中斷處理程式。

這些中斷值通常被稱為中斷請求(IRQ)線。每個IRQ線都會被關聯一個數值量。例如,在經典的PC機上,IRQ 0是時鐘中斷,而IRQ 1是鍵盤中斷。

特定的中斷總是于特定的裝置相關聯,并且核心要知道這些資訊。

2、關于異常

異常與中斷不同,它在産生時必須考慮與處理器時鐘同步。實際上,異常也常常稱為同步中斷。在x86體系結構上如何通過軟中斷實作系統調用,那就是陷入核心,然後引起一種特殊的異常——系統調用處理程式異常。中斷的工作方式與之類似,其差異隻在于中斷是由硬體而不是軟體引起的。

3、關于中斷處理程式

在Linux中,中斷處理程式就是普普通通的C函數。隻不過這些函數必須按照特定的類型聲明,以便核心能夠以标準的方式傳遞處理程式的資訊。

中斷處理程式與其他核心函數的真正差別在于,中斷處理程式是被核心調用來響應中斷的,而它們運作于我們稱之為中斷上下文的特殊上下文。

中斷處理程式必須保證能快速執行。讓它盡可能快速恢複被中斷代碼的執行。

4、關于上半部和下半部的對比

又想中斷處理程式運作得塊,又想中斷處理程式完成的工作量多,這兩個目的顯然有所抵觸。

鑒于兩個目的之間存在沖突關系,是以我們一般把中斷程式切為兩個部分或兩半。

中斷處理程式是上半部——接收到一個中斷,它就立即開始執行,但隻做又嚴格時限的工作,例如對接收的中斷進行應答或複位硬體,這些工作都是在所有中斷被禁止的情況下完成的。

處理和操作資料包的其他工作在下半部進行。比如上半部接收到網卡發來的中斷,中斷處理程式負責應答,接着,由下半部處理後續的事情,比如,将資料包複制到記憶體,對資料包進行運作等等。

5、關于中斷上下文

當執行一個中斷處理程式時,核心處于中斷上下文中。

中斷上下文具有較為嚴格的時間限制,因為它打斷了其他代碼。中斷上下文中的代碼應當迅速、簡潔,盡量不要使用循環去處理繁重的工作。中斷處理程式甚至可以打斷其他中斷線上的另一個中斷處理程式。為了保持中斷處理程式的簡潔,我們盡量把繁重的工作從中斷處理程式中分離出來,放在下半部來執行,因為下半部可以在更合适的時間運作。