中斷處理程序在處理中斷時起到了關鍵作用,也是一個中斷程序必不可少的部分。不過,現如今的中斷處理流程都會分為兩部分:上半部分(top half)和下半部分(bottom half)。為什么要將一個中斷分為如此兩部分?下面的幾個經典原因可以很好的詮釋這個問題。
1.中斷可以隨時的打斷處理機對其他程序的執行,如果被打斷的代碼對系統很重要,那么此時中斷處理程序的執行時間應該是越短越好。
2.通過上文我們知道,中斷處理程序正在執行時,會屏蔽同條中斷線上的中斷請求;而更嚴重的是,如果設置了IRQF_DISABLED,那么該中斷服務程序執行是會屏蔽所有其他的中斷請求。那么此時應該讓中斷處理程序執行的越快越好。
上面的幾個例子都要求中斷服務程序的執行時間越短越好。一般的,中斷處理程序會在上半部分執行。而事實上,幾乎所有的情況,上半部分就只執行中斷處理程序。因此,我們可以這樣認為:一個完整的中斷處理流程是由中斷處理程序和下半部分共同完成的。
這樣劃分是有一定原因的,因為我們必須有一個快速、異步而且簡單的處理程序專門來負責對硬件的中斷請求做出快速響應,與此同時也要完成那些對時間要求很嚴格的操作。而那些對時間要求相對寬松,其他的剩余工作則會在稍候的任意時間執行,也就是在所謂的下半部分去執行。
總之,這樣劃分一個中斷處理過程主要是希望減少中斷處理程序的工作量(當然了,理想情況是將全部工作都拋給下半段。但是中斷處理程序至少應該完成對中斷請求的相應。),因為在它運行期間至少會使得同級的中斷請求被屏蔽,這些都直接關系到整個系統的響應能力和性能。而在下半段執行期間,則會允許響應所有的中斷。
和上半段只能通過中斷處理程序實現不同的是,下半部可以通過多種機制來完成:小任務(tasklet),工作隊列,軟中斷。在本博客后續的文章當中你會看到,不管是那種機制,它們均為下半部提供了一種執行機制,比上半部靈活多了。至于何時執行,則由內核負責。