linux 中斷和中斷處理

來源:互聯網
上載者:User


本章主要描敘Linux核心的中斷處理過程。儘管核心提供通用機制與介面來進行中斷處理,大多數中斷處理細節都是CPU體繫結構相關的。推薦閱讀:《走向linux 2.6》
 

圖7.1 中斷路由的邏輯圖

Linux通過使用多種不同硬體來執行許多不同任務。包括驅動顯示器的視頻裝置、驅動硬碟的IDE裝置等。 我們可以同步驅動這些裝置,即我們可以發送一個請求執行一組操作(比如說將一塊記憶體資料寫入到磁碟)然後等待到執行完畢。這種方式雖然可以工作,但是效率很低,因為作業系統必須等待每個操作的完成,所以作業系統將花費大量時間在“忙等待”上。更為有效方式是執行請求,然後轉去執行其它任務。當裝置完成請求時再通過中斷通知作業系統。這樣系統中可以同時存在多個未完成的任務。

不管CPU在作什麼工作,為了讓裝置產生中斷必須提供一些必要的硬體支援。幾乎所有的通用處理器如 Alpha AXP都使用近似的方法。CPU的一些物理引腳被設計成可以改變電壓(如從+5V變成-5V)從而引起CPU停止當前工作並開始執行處理中斷的特殊代碼:中斷處理常式。這些引腳之一被串連到一個周期性時鐘上並每隔千分之一秒就接收一次中斷,其它引腳則可串連到系統中其它裝置如SCSI控制器上。

系統常使用中斷控制器來在向CPU中斷引腳發送訊號之前將裝置中斷進行分組。這樣可以節省CPU上中斷引腳個數,同時增加了系統設計的靈活性。此中斷控制器通過屏蔽與狀態寄存器來控制中斷。通過設定屏蔽寄存器中的某些位可以使能或者關閉中斷,讀取狀態寄存器可得到系統當前處於活動狀態的中斷。

系統中有些中斷是通過硬連線串連的,如系統時鐘的周期性定時器可能被固定串連到中斷控制器的引腳3上。而其它串連到控制器的引腳只能由插到特定ISA或PCI槽中的控制卡來決定。例如中斷控制器中的引腳4可能被串連到PCI槽號0,但可能某天此槽中插入一塊乙太網路卡而過幾天又會換成SCSI控制器。總之每個系統都有其自身的中斷路由機制,同時作業系統還應該能靈活處理這些情況。

多數現代通用微處理器使用近似的方法來處理中斷。硬體中斷髮生時,CPU將停止執行當前指令並將跳轉到記憶體中包含中斷處理代碼或中斷處理代碼指令分支的位置繼續執行。這些代碼在一種特殊CPU模式: 中斷模式下執行。通常在此模式下不會有其它中斷髮生。但是也有例外;有些CPU將中斷的優先順序進行分類,此時更高優先順序的中斷還可能發生。這樣意味著必須認真編寫第一級中斷處理代碼,同時中斷處理過程應該擁有其自身的堆棧,以便儲存轉到中斷處理過程前的CPU執行狀態(所有CPU的普通寄存器和上下文)。一些CPU具有一組特殊的寄存器-它們僅存在於中斷模式中,在中斷模式下可以使用這些寄存器來儲存執行所需要的執行內容。

當中斷處理完畢後CPU狀態將被重儲,同時中斷也將被釋放。CPU將繼續做那些中斷髮生前要做的工作。中斷處理代碼越精鍊越好,這樣將減少作業系統阻塞在中斷上的時間與頻率。

7.1  可程式化插斷控制器
系統設計者可以自由選擇中斷結構,一般的IBM PC相容將使用Intel 82C59A-2 CMOS可程式化插斷控制器或其派生者。這種控制器在PC誕生之前便已經產生,它的可程式化性體現在那些位於眾所周知ISA記憶體位置中的寄存器上。非Intel系統如基於Alpha AXP的PC不受這些體繫結構限制,它們經常使用各種不同的中斷控制器。

圖7.1給出了兩個級連的8位控制器,每個控制器都有一個屏蔽與中斷狀態寄存器:PIC1和PIC2。這兩個屏蔽寄存器分別位於ISA I/O空間0x21和0xA1處,狀態寄存器則位於0x20和0xA0。對此屏蔽寄存器某個特定位置位將使能某一中斷,寫入0則屏蔽它。但是不幸的是中斷屏蔽寄存器是唯寫的,所以你無法讀取你寫入的值。這也意味著Linux必須儲存一份對屏蔽寄存器寫入值的局部拷貝。一般在中斷使能和屏蔽常式中修改這些儲存值,同時每次將這些全屏蔽碼寫入寄存器。

當有中斷產生時,中斷處理代碼將讀取這兩個中斷狀態寄存器(ISR)。它將0x20中的ISR看成一個16位中斷寄存器的低8位而將0xA0中的ISR看成其高8位。這樣0xA0中ISR第1位上的中斷將被視作系統中斷9。PIC1 上的第二位由於被用來級連PIC2所以不能作其它用處,PIC2上的任何中斷將導致PIC1的第二位被置位。

7.2  初始化中斷處理資料結構
核心的中斷處理資料結構在裝置驅動請求系統中斷控制時建立。為完成此項工作,裝置驅動使用一組Linux核心函數來請求中斷,使能中斷和屏蔽中斷。
每個裝置驅動將調用這些過程來註冊其中斷處理常式地址。

有些中斷由於傳統的PC體繫結構被固定下來,所以驅動僅需要在其初始化時請求它的中斷。磁碟片裝置驅動正是使用的這種方式;它的中斷號總為6。有時裝置驅動也可能不知道裝置使用的中斷號。對PCI裝置驅動來說這不是什麼大問題,它們總是可以知道其中斷號。但對於ISA裝置驅動則沒有取得中斷號的方便方式。Linux通過讓裝置驅動檢測它們的中斷號來解決這個問題。

裝置驅動首先迫使裝置引起一個中斷。系統中所有未被分配的中斷都被使能。此時裝置引發的中斷可以通過可程式化插斷控制器來發送出去。Linux再讀取中斷狀態寄存器並將其內容返回給裝置驅動。非0結果則表示在此次檢測中有一個或多個中斷髮生。裝置驅動然後將關閉檢測並將所有未分配中斷屏蔽掉。

如果ISA裝置驅動成功找到了裝置的IRQ號,就可以象平常一樣請求對裝置的控制。

基於PCI系統比基於ISA系統有更多的動態性。ISA裝置使用的中斷引腳通常是通過硬體裝置上的跳線來設定並固定在裝置驅動中。PCI裝置在系統啟動與初始化PCI時由PCI BIOS或PCI子系統來分配中斷。每個PCI裝置可以使用A,B,C或D之中的任意中斷。這個中斷在裝置建立時確定且通常多數裝置的預設中斷為 A。PCI槽中的PCI中斷連線A,B,C和D被正確路由到中斷控制器中。所以PCI槽4上的引腳A可能被路由到中斷控制器上的引腳6,PCI槽7上的引腳B被路由到中斷控制器上的引腳7等等。

如何路由PCI中斷完全取決於特定的系統,一般設定代碼能理解PCI中斷路由拓撲。在基於Intel的PC上由系統BIOS代碼在啟動時作這些設定而在不帶BIOS(如Alpha AXP)系統中由Linux核心來完成這個任務。

PCI設定代碼將每個裝置對應的中斷控制器的引腳號寫入PCI配置頭中。通過得到PCI中斷路由拓撲及裝置的PCI槽號和PCI中斷引腳設定代碼可以確定其對應的中斷引腳(或IRQ)號。裝置使用的中斷引腳被儲存在此裝置的PCI配置頭中為此目的保留的中斷連線域中。當運行裝置驅動時這些資訊被讀出並用來控制來自Linux核心的插斷要求。

系統中可能存在許多PCI中斷源,比如在使用PCI-PCI橋接器時。這些中斷源的個數可能將超出系統可程式化插斷控制器的引腳數。此時PCI裝置必須共用中斷號-中斷控制器上的一個引腳可能被多個PCI裝置同時使用。Linux讓中斷的第一個要求者申明此中斷是否可以共用。中斷的共用將導致irq_action數組中的一個入口同時指向幾個irqaction資料結構。當共用中斷髮生時Linux將調用對應此中斷源的所有中斷處理過程。沒有中斷需要服務時,任何共用此中斷(所有的PCI裝置驅動)的裝置驅動都要準備好其中斷處理過程的調用。

7.3  中斷處理

圖7.2 Linux中斷處理資料結構

Linux中斷處理子系統的一個基本任務是將中斷正確路由到中斷處理代碼中的正確位置。這些代碼必須瞭解系統的中斷拓撲結構。例如在中斷控制器上引腳6上發生的磁碟片控制器中斷必須被辨認出的確來自磁碟片並路由到系統的磁碟片裝置驅動的中斷處理代碼中。Linux使用一組指標來指向包含處理系統中斷的常式的調用地址。這些常式屬於對應於此裝置的裝置驅動,同時由它負責在裝置初始化時為每個裝置驅動申請其請求的中斷。圖7.2給出了一個指向一組irqaction的irq_action指標。每個irqaction資料結構中包含了對應於此中斷處理的相關資訊,包括中斷處理常式的地址。而中斷個數以及它們被如何處理則會根據體繫結構及系統的變化而變化。Linux中的中斷處理代碼就是和體繫結構相關的。這也意味著irq_action數組的大小隨於中斷源的個數而變化。

中斷髮生時Linux首先讀取系統可程式化插斷控制器中中斷狀態寄存器判斷出中斷源,將其轉換成irq_action數組中位移值。例如中斷控制器引腳6來自磁碟片控制器的中斷將被轉換成對應於中斷處理過程數組中的第7個指標。如果此中斷沒有對應的中斷處理過程則Linux核心將記錄這個錯誤,不然它將調用對應此中斷源的所有irqaction資料結構中的中斷處理常式。

當Linux核心調用裝置驅動的中斷處理過程時此過程必須找出中斷產生的原因以及相應的解決辦法。為了找到裝置驅動的中斷原因,裝置驅動必須讀取發生中斷裝置上的狀態寄存器。裝置可能會報告一個錯誤或者通知請求的處理已經完成。如磁碟片控制器可能將報告它已經完成磁碟片讀取磁頭對某個扇區的正確定位。一旦確定了中斷產生的原因,裝置驅動還要完成更多的工作。如果這樣Linux核心將延遲這些操作。以避免了CPU在中斷模式下花費太多時間。在裝置驅動中斷中我們將作詳細討論。

上一篇:《[c/c++]關於volatile關鍵字的說明以及測試》
下一篇:《TCP/IP網路基礎》


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.