Linux中斷分為硬中斷和非強制中斷。
硬中斷是由硬體裝置觸發的中斷。I/O裝置要產生硬中斷時,會由中斷控制器發送一個電訊號,核心的裝置驅動程式接收到這個電訊號,就會調用相應的中斷處理函數對這個中斷進行處理。硬中斷可以在任何時刻到來,它代表的系統必須馬上處理的緊急任務,也簡稱為中斷的上半部,與此對應的是中斷下半部(buttom half),也稱為非強制中斷,代表的系統不必馬上處理的、沒那麼緊急的任務。
非強制中斷處理函數一般在硬中斷處理函數的末尾調用。硬中斷處於所謂的“中斷上下文中”。與此對應的是“進程上下文”。下面解釋一下進程上下文,每個使用者進程都可以分為使用者態和核心態,一般情況下進程運行在使用者態,當進程調用系統調用函數時,會進入核心態,這個時候進程就處於核心態的“進程上下文”中,當然核心的線程也屬於進程上下文,如ksoftirqd線程。所以核心態有兩種上下文,一種是“中斷上下文”,一種是“進程上下文”。中斷上下文一般處理一些耗時不是很長,對即時性要求很高,執行頻度較高的應用。
比較特殊的是非強制中斷,非強制中斷會在中斷處理完成後返回時執行,這個時候是處於中斷上下文中的。在以前的核心版本中,沒有出現ksoftirqd核心線程來防止非強制中斷的重複調用,此時非強制中斷會一直運行在“中斷上下文中”。在後期的核心版本中,為了防止執行非強制中斷的時候非強制中斷又一直被觸發,而讓別的進程等的太久的情況發生, 在執行次數到了一個最大值的時候就執行核心線程ksoftirqd,然後中斷就返回了.而不是一直 執行非強制中斷.在ksoftirqd這個核心線程中執行非強制中斷,此時就是在進程上下文中了。此時,非強制中斷極可能出現在“中斷上下文”,也可能出現在“進程上下文”。
中斷有各自的優先順序,以響應不同的處理請求。非強制中斷的優先順序相對來說處於低位,可被硬中斷中斷,但不會被使用者的代碼中斷。而
硬中斷不可能被其他中斷中斷。
引用《深入Linux核心架構》書中關於中斷上下文與進程內容相關的不同之處:
(1)中斷是非同步執行的,它們可以在任何時間發生。
(2)中斷上下文中不能調用調度器,因而不能自動地放棄控制權。
(3)中斷處理常式不能進入睡眠狀態。原因是中斷上下文不允許中斷,進程睡眠後,核心只能永遠地等待下去。
這是目前對Linux中斷的理解,可能有偏差,再慢慢修正吧。