輸入輸出系統與裝置管理

中斷服務常式(an interrupt service routine)

當 CPU 的門鈴(一個中斷)響起時,總得有人真的去應門。中斷服務常式就是那個應門的人:一段特定的核心程式碼,回應某個特定中斷而執行、處理那個事件,然後讓被中斷的程式繼續。不同事件有不同的處理常式——磁碟一個、鍵盤一個、計時器一個——而 CPU 會自動挑出正確的那個。

具體來說,正確的處理常式是這樣被找到並執行的。CPU 保有一個稱為中斷向量的表(在 x86 上是中斷描述表),把每個中斷編號對應到它處理常式的位址。當第 k 號中斷觸發時,CPU 存下執行中程式的關鍵狀態、切換到核心模式,並跳到第 k 項所存位址的處理常式。處理常式必須迅速完成它的工作:從控制器的狀態暫存器讀出中斷發生的原因、向裝置確認以使它停止拉起中斷線、搬移或記下相關資料,並可能喚醒一個正在等待的行程。接著它返回,CPU 還原存下的狀態,被中斷的程式繼續。由於處理常式本身可能被一個更高優先權的中斷打斷,又由於它在一個借來的環境中執行,它必須避免緩慢的操作,也不能呼叫可能阻塞或入睡的常式。

為什麼重要:中斷服務常式是作業系統即時面對硬體事件的地方,所以規則很嚴格。它應該很短,因為當它執行時,別的工作(往往還有別的中斷)可能被擋住。正是這股要讓處理常式保持簡短的壓力,使得回應中冗長、不緊急的部分被延後到一個下半部(softirq、tasklet 或工作佇列),稍後在開啟中斷的狀態下執行,只把真正具時效性的部分留在中斷服務常式本身。

鍵盤的中斷服務常式在你按下一個鍵的瞬間執行:它從控制器的資料暫存器讀出掃描碼、告訴控制器已經處理完、把那個碼放進核心的輸入緩衝區,然後返回——通常在幾微秒內完成。

透過中斷向量找到它,它迅速處理事件,再返回被中斷的程式碼。

中斷服務常式在受限的環境中執行:它不能安全地入睡或阻塞,因為沒有一個正常的行程可以被安置入睡。任何可能要等待的事都必須推到下半部——把緩慢的工作放進中斷服務常式裡是經典的核心臭蟲。

又稱
ISRinterrupt handler中斷處理常式