一、前言
Linux的中斷宏觀分為兩種:軟中斷和硬中斷。聲明一下,這裡的軟和硬的意思是指和軟體相關以及和硬體相關,而不是軟體實現的中斷或硬體實現的中斷。
軟中斷就是"訊號機制"。軟中不是軟體中斷。 Linux透過訊號產生對流程的各種中斷操作,我們現在所知道的訊號共有31個,其具體內容這裡略過,有興趣讀者可參考相關參考文獻[1]。一般來說,軟中斷是由內核機制的觸發事件引起的(例如進程運行逾時),但是不可忽視有大量的軟中斷也是由於和硬體有關的中斷引起的,例如當印表機端口產生一個硬體中斷時,會通知和硬體相關的硬中斷,硬中斷就會產生一個軟中斷並送到作業系統核心裡,這樣核心就會根據這個軟中斷喚醒睡眠在印表機任務佇列中的處理程序。
硬中斷就是通常意義上的"中斷處理程序",它是直接處理由硬體發送過來的中斷訊號的。當硬中斷收到它應處理的中斷訊號以後,就回去自己驅動的裝置上去看看裝置的狀態暫存器以了解發生了什麼事情,並進行相應的操作。對於軟中斷,我們不做討論,那是進程調度裡要考慮的事情。由於我們討論的是裝置驅動程式的中斷問題,所以焦點集中在硬中斷。我們這裡討論的是硬中斷,也就是和硬體相關的中斷。
二、中斷產生
要中斷,是因為外設需要通知操作系統她那裡發生了一些事情,但是中斷的功能僅僅是一個設備警報燈,當燈亮的時候中斷處理程序只知道有事情發生了,但發生了什麼事還要親自到設備那裡去看才行。也就是說,當中斷處理程序得知設備發生了一個中斷的時候,它並不知道設備發生了什麼事情,只有當它訪問了設備上的一些狀態寄存器以後,才能知道具體發生了什麼,怎麼去處理。
設備透過中斷線向中斷控制器發送高電平告訴作業系統它產生了一個中斷,而作業系統會從中斷控制器的狀態位元知道是哪條中斷線上產生了中斷。 PC機上使用的中斷控制器是8259,這種控制器每一個可以管理8條中斷線,當兩個8259級聯的時候共可以控制15條中斷線。這裡的中斷線是實實在在的電路,他們透過硬體介面連接到CPU外的設備控制器。
三、IRQ
並不是每個設備都可以向中斷線上發中斷信號的,只有對某一條確定的中斷線勇有了控制權,才可以向這條中斷線上發送信號。由於電腦的外部設備越來越多,所以15條中斷線已經不夠用了,中斷線是非常寶貴的資源。要使用中斷線,就得進行中斷線的申請,就是IRQ(Interrupt Requirement),我們也常把申請一條中斷線成為申請一個IRQ或是申請一個中斷號。
IRQ是非常寶貴的,所以我們建議只有當設備需要中斷的時候才申請佔用一個IRQ,或者是在申請IRQ時採用共享中斷的方式,這樣可以讓更多的設備使用中斷。
無論對IRQ的使用方式是獨佔還是共享,申請IRQ的過程都是一樣的,分為3步:
1.將所有的中斷線探測一遍,看看哪些中斷還沒有被佔用。從這些還沒有被佔用的中斷中選一個作為該設備的IRQ。
2.透過中斷申請函數申請選定的IRQ,這是要指定申請的方式是獨佔還是共享。
3.根據中斷申請函數的回傳值決定怎麼做:如果成功了萬事大吉,如果沒成功則或重新申請或放棄申請並回傳錯誤。
申請IRQ的過程,在參考書的配的源代碼裡有詳細的描述,讀者可以通過仔細閱讀源代碼中的short一例對中斷號申請由深刻的理解。
以上就是深入淺出分析Linux裝置驅動程式中斷 (1)的內容,更多相關內容請關注PHP中文網(www.php.cn)!