Linux 核心需要對串連到電腦上的所有硬體裝置進行管理,毫無疑問這是它的份內事。如果要管理這些裝置,首先得和它們互相通訊才行,一般有兩種方案可實現這種功能:
1.輪詢(polling) 讓核心定期對裝置的狀態進行查詢,然後做出相應的處理;
2.中斷(interrupt) 讓硬體在需要的時候向核心發出訊號(變核心主動為硬體主動)。
第一種方案會讓核心做不少的無用功,因為輪詢總會周期性的重複執行,大量地耗用 CPU 時間,因此效率及其低下,所以一般都是採用第二種方案。
什麼是中斷?
從物理學的角度看,中斷是一種電訊號,由硬體裝置產生,並直接送入中斷控制器(如 8259A)的輸入引腳上,然後再由中斷控制器向處理器發送相應的訊號。處理器一經檢測到該訊號,便中斷自己當前正在處理的工作,轉而去處理中斷。此後,處理器會通知 OS 已經產生中斷。這樣,OS 就可以對這個中斷進行適當的處理。
不同的裝置對應的中斷不同,而每個中斷都通過一個唯一的數位識別碼,這些值通常被稱為插斷要求線(IRQ)。
中斷可分為同步(synchronous)中斷和非同步(asynchronous)中斷:
1. 同步中斷是當指令執行時由 CPU 控制單元產生,之所以稱為同步,是因為只有在一條指令執行完畢後 CPU 才會發出中斷,而不是發生在代碼指令執行期間,比如系統調用。
2. 非同步中斷是指由其他硬體裝置依照 CPU 時鐘訊號隨機產生,即意味著中斷能夠在指令之間發生,例如鍵盤中斷。
什麼是異常?
同步中斷又稱為異常(exception),非同步中斷則被稱為中斷(interrupt)。我們通常講的中斷指的都是非同步中斷。
1.中斷可分為可屏蔽中斷(Maskable interrupt)和非屏蔽中斷(Nomaskable interrupt)。
2.異常可分為故障(fault)、陷阱(trap)、終止(abort)三類。
這些類別之間的異同點請參看 表 1。
表 1:中斷類別及其行為
類別 原因 非同步/同步 返回行為
中斷 來自I/O裝置的訊號 非同步 總是返回到下一條指令
陷阱 有意的異常 同步 總是返回到下一條指令
故障 潛在可恢複的錯誤 同步 返回到當前指令
終止 不可恢複的錯誤 同步 不會返回
什麼是中斷處理常式?
在響應一個特定中斷的時候,核心會執行一個函數,該函數叫做中斷處理常式或插斷服務常式。產生中斷的每個裝置都有一個相應的中斷處理常式,如果一個裝置可以產生多種不同的中斷,那麼該裝置就可以對應多個中斷處理常式。一個裝置的中斷處理常式是它裝置驅動程式的一部分。
什麼是中斷上半部和下半部?
中斷處理一般分為兩個部分,中斷處理常式是上半部:接收到一個中斷就立即執行,但只做有嚴格時限的工作,這些工作都是在所有中斷被禁止的情況下完成的。能夠被允許稍後完成的工作被延遲到下半部去。通常情況下,下半部會在中斷處理常式返回時立即執行。