導航:首頁 > 器材知識 > 中斷處理和設備處理如何合作

中斷處理和設備處理如何合作

發布時間:2021-10-31 17:25:32

A. 中斷處理是什麼

中斷處理

當CPU(中央處理器)執行一條現行指令的時候,如果外設向CPU發出中斷請求,那麼CPU在滿足響應的情況下,將發出中斷響應信號,與此同時關閉中斷,表示CPU不在受理另外一個設備的中斷。

這時,CPU將尋找中斷請求源是哪一個設備,並保存CPU自己的程序計數器(PC)的內容。然後,他將轉移到處理該中斷源的中斷服務程序。CPU在保存現場信息,設備服務(如交換數據)以後,將恢復現場信息。在這些動作完成以後,開放中斷,並返回到原來被中斷的主程序的下一條指令。

(1)中斷處理和設備處理如何合作擴展閱讀

當中斷處理完畢後,用戶通過POP指令將保存在堆棧中的各個寄存器的內容彈出,即恢復主程序斷點處寄存器的原值。

在中斷服務子程序的最後要安排一條中斷返回指令IRET,執行該指令,系統自動將堆棧內保存的 IP/EIP和CS值彈出,從而恢復主程序斷點處的地址值,同時還自動恢復標志寄存器FR或EFR的內容,使CPU轉到被中斷的程序中繼續執行。

B. 中斷處理系統一般是由什麼組成

以下來源於網路 希望對你有所幫助

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

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

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

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

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

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

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

圖7.1給出了兩個級連的8位控制器,每個控制器都有一個屏蔽與中斷狀態寄存器:PIC1和PIC2。這兩個屏蔽寄存器分別位於ISAI/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時由PCIBIOS或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(如AlphaAXP)系統中由Linux核心來完成這個任務。

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

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

7.3中斷處理

圖7.2Linux中斷處理數據結構

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

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

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

C. 在計算機系統中,請解釋什麼是中斷,請用流程圖畫出一次中斷處理流程

中斷是指計算機運行過程中,出現某些意外情況需主機干預時,機器能自動停止正在運行的程序並轉入處理新情況的程序,處理完畢後又返回原被暫停的程序繼續運行。

中斷流程圖如下:

(3)中斷處理和設備處理如何合作擴展閱讀

眾所周知,處理器的速度跟外圍硬體設備的速度往往不在一個數量級上,因此,如果內核採取讓處理器向硬體發出一個請求,然後專門等待回應的辦法,顯然降低內核效率。

既然硬體的響應這么慢,那麼內核就應該在此期間處理其他事務,等到硬體真正完成了請求的操作之後,再回過頭來對它進行處理。想要實現這種功能,輪詢(polling)可能會是一種解決辦法。可以讓內核定期對設備的狀態進行查詢,然後做出相應的處理。

不過這種方法很可能會讓那個內核做不少無用功,因為無論硬體設備是正在忙碌著完成任務還是已經大功告成,輪詢總會周期性的重復執行。更好的辦法是由我們來提供一種機制,讓硬體在需要的時候再向內核發出信號(變內核主動為硬體主動),這就是中斷機制。

中斷使得硬體得以與處理器進行通信。舉個例子,在你敲打鍵盤的時候,鍵盤控制器(控制鍵盤的硬體設備)會發送一個中斷,通知操作系統有鍵按下。中斷本質是一種特殊的電信號,由硬體設備發向處理器。

處理器接受到中斷後,會馬上向操作系統反映此信號的到來,然後就由os負責處理這些新到來的數據。硬體設備生成中斷的時候並不考慮與處理器的時鍾同步——換句話說就是中斷隨時可以產生。因此,內核隨時可能因為新到來的中斷而被打斷。

不同的設備對應的中斷不同,而每個中斷都通過一個惟一的數字標識。因此,來自鍵盤的中斷就有別於來自硬碟的中斷,從而使得操作系統能夠對中斷進行區分,並知道哪個硬體設備產生了哪個中斷。這樣,操作系統才能給不同的中斷提供不同的中斷處理程序。

在它執行程序的時候,如果有另外的事件發生(比如用戶又打開了一個程序)那麼這時候就需要由計算機系統的中斷機制來處理了。

中斷機制包括硬體的中斷裝置和操作系統的中斷處理服務程序。

讓硬體在需要的時候再向內核發出信號。

參考資料來源:網路-中斷機制

參考資料來源:網路-中斷

D. 系統中斷的中斷處理

中斷處理一般分為中斷響應和中斷處理兩個步驟。中斷響應由硬體實施,中斷處理主要由軟體實施。
(1)中斷響應
對中斷請求的整個處理過程是由硬體和軟體結合起來而形成的一套中斷機構實施的。發生中斷時,CPU暫停執行當前的程序,而轉去處理中斷。這個由硬體對中斷請求作出反應的過程,稱為中斷響應。一般說來,中斷響應順序執行下述三步動作:
◆中止當前程序的執行;
◆保存原程序的斷點信息(主要是程序計數器PC和程序狀態寄存器PS的內容);
◆從中斷控制器取出中斷向量,轉到相應的處理程序。
通常CPU在執行完一條指令後,立即檢查有無中斷請求,如果有,則立即做出響應。
當發生中斷時,系統作出響應,不管它們是來自硬體(如來自時鍾或者外部設備)、程序性中斷(執行指令導致「軟體中斷」—Software Interrupts),或者來自意外事件(如訪問頁面不在內存)。
如果當前CPU的執行優先順序低於中斷的優先順序,那麼它就中止對當前程序下條指令的執行,接受該中斷,並提升處理機的執行級別(一般與中斷優先順序相同),以便在CPU處理當前中斷時,能屏蔽其它同級的或低級的中斷,然後保存斷點現場信息,通過取得的中斷向量轉到相應的中斷處理程序的入口。
(2)中斷處理
CPU從中斷控制器取得中斷向量,然後根據具體的中斷向量從中斷向量表IDT中找到相應的表項,該表項應是一個中斷門。於是,CPU就根據中斷門的設置而到達了該通道的總服務程序的入口。
核心對中斷處理的順序主要由以下動作完成:
◆保存正在運行進程的各寄存器的內容,把它們放入核心棧的新幀面中。
◆確定「中斷源」或核查中斷發生,識別中斷的類型(如時鍾中斷或盤中斷)和中斷的設備號(如哪個磁碟引起的中斷)。系統接到中斷後,就從機器那裡得到一個中斷號,它是檢索中斷向量表的位移。中斷向量因機器而異,但通常都包括相應中斷處理程序入口地址和中斷處理時處理機的狀態字。
◆核心調用中斷處理程序,對中斷進行處理。
◆中斷處理完成並返回。中斷處理程序執行完以後,核心便執行與機器相關的特定指令序列,恢復中斷時寄存器內容和執行核心棧退棧,進程回到用戶態。如果設置了重調度標志,則在本進程返回到用戶態時做進程調度。

E. 一般中斷處理的主要步驟是什麼

一般中斷處理的主要步驟分別是中斷請求、中斷判優、中斷響應、中斷處理和中斷返回。
在微機系統中,對於外部中斷,中斷請求信號是由外部設備產生,並施加到CPU的NMI或INTR引腳上,CPU通過不斷地檢測NMI和INTR引腳信號來識 別是否有中斷請求發生。對於內部中斷,中斷請求方式不需要外部施加信號激發,而是通過內部中斷控制邏輯去調用。無論是外部中斷還是內部中斷,中斷處理過程 都要經歷以下步驟:請求中斷→響應中斷→關閉中斷→保留斷點→中斷源識別→保護現場→中斷服務子程序→恢復現場→中斷返回。

請求中斷
當某一中斷源需要CPU為其進行中斷服務時,就輸出中斷請求信號,使中斷控制系統的中斷請求觸發器置位,向CPU請求中斷。系統要求中斷請求信號一直保持到CPU對其進行中斷響應為止。

中斷響應
CPU對系統內部中斷源提出的中斷請求必須響應,而且自動取得中斷服務子程序的入口地址,執行中斷 服務子程序。對於外部中斷,CPU在執行當前指令的最後一個時鍾周期去查詢INTR引腳,若查詢到中斷請求信號有效,同時在系統開中斷(即IF=1)的情 況下,CPU向發出中斷請求的外設回送一個低電平有效的中斷應答信號,作為對中斷請求INTR的應答,系統自動進入中斷響應周期。

關閉中斷
CPU響應中斷後,輸出中斷響應信號,自動將狀態標志寄存器FR或EFR的內容壓入堆棧保護起來,然後將FR或EFR中的中斷標志位IF與陷阱標志位TF清零,從而自動關閉外部硬體中斷。因為CPU剛進入中斷時要保護現場,主要涉及堆棧操作,此時不能再響應中斷,否則將造成系統混亂。

保護斷點
保護斷點就是將CS和IP/EIP的當前內容壓入堆棧保存,以便中斷處理完畢後能返回被中斷的原程序繼續執行,這一過程也是由CPU自動完成。

中斷源識別
當系統中有多個中斷源時,一旦有中斷請求,CPU必須確定是哪一個中斷源提出的中斷請求,並由中斷控制器給出中斷服務子程序的入口地址,裝入CS與IP/EIP兩個寄存器。CPU轉入相應的中斷服務子程序開始執行。

保護現場
主程序和中斷服務子程序都要使用CPU內部寄存器等資源,為使中斷處理程序不破壞主程序中寄存器的內容,應先將斷點處各寄存器的內容壓入堆棧保護起來,再進入的中斷處理。現場保護是由用戶使用PUSH指令來實現的。

中斷服務
中斷服務是執行中斷的主體部分,不同的中斷請求,有各自不同的中斷服務內容,需要根據中斷源所要完成的功能,事先編寫相應的中斷服務子程序存入內存,等待中斷請求響應後調用執行。

恢復現場
當中斷處理完畢後,用戶通過POP指令將保存在堆棧中的各個寄存器的內容彈出,即恢復主程序斷點處寄存器的原值。

中斷返回
在中斷服務子程序的最後要安排一條中斷返回指令IRET,執行該指令,系統自動將堆棧內保存的 IP/EIP和CS值彈出,從而恢復主程序斷點處的地址值,同時還自動恢復標志寄存器FR或EFR的內容,使CPU轉到被中斷的程序中繼續執行。

F. 什麼是中斷簡述中斷處理過程

中斷就是執行中斷服務程序,這是中斷系統的核心。不同計算機系統的中斷處理過程各具特色,但對多數計算機而言,其中中斷服務程序的流程如下。 中斷處理過程基本上由3部分組成,第一部分為准備部分,其基本功能是保護現場,對於非向量中斷方式則需要確定中斷源,最後開放中斷,允許更高級的中斷請求打斷低級的中斷服務程序;第二部分為處理部分,即真正執行具體的為某個中斷源服務的中斷服務程序;第三部分為結尾部分,首先要關中斷,以防止在恢復現場過程中被新的中斷請求打斷,接著恢復現場,然後開放中斷,以便返回原來的程序後可響應其他的中斷請求。中斷服務程序的最後一條指令一定是中斷返回指令。

一個完整的中斷過程包括:

中斷請求:是指中斷源(引起中斷的事件或設備)向CPU
 發出的請求中斷的要求。
中斷判優:當有多個中斷源發出請求時,需要通過適當的辦法決定先處理哪個中斷請求;
中斷響應:指CPU中止現行程序轉至中斷服務程序的過程;
中斷處理:就是指CPU執行中斷服務程序;
中斷返回:   執行完中斷服務程序後,返回到被中斷的程序

 

中斷的作用:

(1)CPU與I/O設備並行工作
(2)硬體故障處理
(3)實現人機聯系:在計算機工作過程中,如果用戶要干預機器,如查看計算的中間結果,了解機器的工作狀態,給機器下達臨時性的命令等。在沒有中斷系統的計算機里這些功能幾乎是無法實現的。
(4)實現多道程序和分時操作
(5)實現實時處理
(6)實現應用程序和操作系統的聯系
(7)多處理機系統各處理機間的聯系

G. 簡述中斷處理的過程。指出其中哪些工作是由硬體完成的,哪些是由軟體實現的

CPU中斷處理過程為首先,將斷點處的PC值(即下一條應執行指令的地址)推入堆棧保留下來,這稱為保護斷點,由硬體自動執行。然後,將有關的寄存器內容和標志位狀態推入堆棧保留下來,這稱為保護現場,由軟體執行完成。保護斷點和現場後即可執行中斷服務程序,執行完畢,CPU由中斷服務程序返回主程序。

中斷返回過程為首先恢復原保留寄存器的內容和標志位的狀態,這稱為恢復現場,由軟體執行完成。然後,再加返回指令RETI,RETI指令的功能是恢復PC值,使CPU返回斷點,這稱為恢復斷點。恢復現場和斷點後,CPU將繼續執行原主程序,中斷響應過程到此為止。

(7)中斷處理和設備處理如何合作擴展閱讀:

幾個中斷請求可能同時出現,但中斷系統只能按一定的次序來響應和處理。可最先被響應的中斷具有最高優先權,按優先順序別順序進行處理。優先權高低是由中斷部件的中斷排隊線路確定的。對應於各中斷級設置相應的屏蔽位。只有屏蔽位為1時,該中斷級才能參加中斷優先權排隊。

當機器設置很多中斷源時,為了簡化設計,對中斷源分組管理。具有相同中斷優先權的中斷源構成一個中斷級。同一級中斷使用同一個中斷控製程序起點。

H. 中斷的沖突解決

中斷的處理過程為:關中斷(在此中斷處理完成前,不處理其它中斷)、保護現場、執行中斷服務程序、恢復現場、開中斷。
現在我們已經基本知道了IRQ、DMA和I/O的概念,下面我就要說一下如何解決常見的中斷沖突問題。
眾所周知,現在的win9x已經運用PNP技術,它可以將中斷進行自動分配,這種「即插即用」的功能可以說是大大簡化了用戶的操作。不過任何事物都有好與不好兩方面,這種PNP技術也有它的弱點,那就是如果不能認出要安裝的新設備,那麼自動分配中斷時就會產生沖突。現在新的硬體產品層出不窮,各種產品又相互兼容,功能類似,這就導致了win9x常常不能正確檢測出新設備,中斷沖突也就不可避免了。
知道了沖突產生的原因,那我們如果解決沖突呢?在此我就詳細的談一談在win9x下中斷沖突的解決。首先我們要知道系統中沖突的設備,做法是在控制面板中雙擊「系統」圖標,查看設備管理器中的各設備。一般有「?」和「!」的設備要注意了,有問題的設備就是它們了。解決方法有分兩步做:
第一步、先刪去有「?」和「!」的設備,然後重新啟動,讓計算機自己再認一遍這些設備。這樣做是因為部分有「?」和「!」的設備可能是驅動程序安裝有誤,再重裝一遍可解決問題。
第二步、如果上面一步還是不能解決問題,現在多半是中斷沖突了,那我們只能手動調整來解決中斷沖突。在系統=>設備管理器=>屬性中我們可以看到系統資源分配的情況,通過查看此項就可從中了解到哪些系統資源被佔用,哪些系統資源還沒有用,用戶做相應的調整即可。

I. 中斷處理系統一般是由什麼組成大神們幫幫忙

以下來源於網路 希望對你有所幫助 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在中斷模式下花費太多時間。在設備驅動中斷中我們將作詳細討論。
求採納

J. 設備中斷處理程序通常需完成哪些工作

進行進程上下文的切換,對處理中斷信號源進行測試,讀取設備狀態和修改進程狀態等

閱讀全文

與中斷處理和設備處理如何合作相關的資料

熱點內容
路由器上有unknown連接是什麼設備 瀏覽:525
啟辰D50分離軸承多少錢 瀏覽:386
牙機雕刻機與電動工具 瀏覽:208
外匯期貨交易實驗裝置 瀏覽:791
設備投資怎麼算 瀏覽:95
好的攝影器材有哪些 瀏覽:463
溫州新五金製品有限公司怎麼樣 瀏覽:293
錦州五金機電城出租出售 瀏覽:417
卡爾蔡司公司有哪些醫學器材 瀏覽:261
重慶市機械鑿打岩石套什麼定額 瀏覽:557
閥門外面加個框是什麼意思 瀏覽:756
會議設備系統哪裡有 瀏覽:340
列印室需要哪些設備多少錢 瀏覽:577
通用型機床設備加工用於什麼 瀏覽:290
書畫工具箱套裝 瀏覽:772
燃燒固體需要哪些儀器 瀏覽:969
2213ktn1是什麼軸承 瀏覽:640
電腦固體硬碟怎麼加機械硬碟 瀏覽:197
崑山汽車門板超聲波焊接機怎麼樣 瀏覽:787
發說說怎麼隱藏設備 瀏覽:804