欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
中斷及中斷處理
Table of ContentsShow FramesNo Frames

 

第七章 中斷及中斷處理


本章主要描敘Linux核心的中斷處理過(guò)程。盡管核心提供通用機制與接口來(lái)進(jìn)行中斷處理,大多數中斷處理細節都是CPU體系結構相關(guān)的。

 


 

圖7.1 中斷路由的邏輯圖

 

Linux通過(guò)使用多種不同硬件來(lái)執行許多不同任務(wù)。包括驅動(dòng)顯示器的視頻設備、驅動(dòng)硬盤(pán)的IDE設備等。 我們可以同步驅動(dòng)這些設備,即我們可以發(fā)送一個(gè)請求執行一組操作(比如說(shuō)將一塊內存數據寫(xiě)入到磁盤(pán))然后等待到執行完畢。這種方式雖然可以工作,但是效率很低,因為操作系統必須等待每個(gè)操作的完成,所以操作系統將花費大量時(shí)間在“忙等待”上。更為有效的方式是執行請求,然后轉去執行其它任務(wù)。當設備完成請求時(shí)再通過(guò)中斷通知操作系統。這樣系統中可以同時(shí)存在多個(gè)未完成的任務(wù)。

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

系統常使用中斷控制器來(lái)在向CPU中斷引腳發(fā)送信號之前將設備中斷進(jìn)行分組。這樣可以節省CPU上中斷引腳個(gè)數,同時(shí)增加了系統設計的靈活性。此中斷控制器通過(guò)屏蔽與狀態(tài)寄存器來(lái)控制中斷。通過(guò)設置屏蔽寄存器中的某些位可以使能或者關(guān)閉中斷,讀取狀態(tài)寄存器可得到系統當前處于活動(dòng)狀態(tài)的中斷。

系統中有些中斷是通過(guò)硬連線(xiàn)連接的,如實(shí)時(shí)時(shí)鐘的周期性定時(shí)器可能被固定連接到中斷控制器的引腳3上。而其它連接到控制器的引腳只能由插到特定ISA或PCI槽中的控制卡來(lái)決定。例如中斷控制器中的引腳4可能被連接到PCI槽號0,但可能某天此槽中插入一塊以太網(wǎng)卡而過(guò)幾天又會(huì )換成SCSI控制器??傊總€(gè)系統都有其自身的中斷路由機制,同時(shí)操作系統還應該能靈活處理這些情況。

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

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

 

7.1  可編程中斷控制器

系統設計者可以自由選擇中斷結構,一般的IBM PC兼容將使用Intel 82C59A-2 CMOS可編程中斷控制器或其派生者。這種控制器在PC誕生之前便已經(jīng)產(chǎn)生,它的可編程性體現在那些位于眾所周知ISA內存位置中的寄存器上。非Intel系統如基于A(yíng)lpha AXP的PC不受這些體系結構限制,它們經(jīng)常使用各種不同的中斷控制器。

圖7.1給出了兩個(gè)級連的8位控制器,每個(gè)控制器都有一個(gè)屏蔽與中斷狀態(tài)寄存器:PIC1和PIC2。這兩個(gè)屏蔽寄存器分別位于ISA I/O空間0x21和0xA1處,狀態(tài)寄存器則位于0x20和0xA0。對此屏蔽寄存器某個(gè)特定位置位將使能某一中斷,寫(xiě)入0則屏蔽它。但是不幸的是中斷屏蔽寄存器是只寫(xiě)的,所以你無(wú)法讀取你寫(xiě)入的值。這也意味著(zhù)Linux必須保存一份對屏蔽寄存器寫(xiě)入值的局部拷貝。一般在中斷使能和屏蔽例程中修改這些保存值,同時(shí)每次將這些全屏蔽碼寫(xiě)入寄存器。

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

 

7.2  初始化中斷處理數據結構

核心的中斷處理數據結構在設備驅動(dòng)請求系統中斷控制時(shí)建立。為完成此項工作,設備驅動(dòng)使用一組Linux核心函數來(lái)請求中斷,使能中斷和屏蔽中斷。

每個(gè)設備驅動(dòng)將調用這些過(guò)程來(lái)注冊其中斷處理例程地址。

有些中斷由于傳統的PC體系結構被固定下來(lái),所以驅動(dòng)僅需要在其初始化時(shí)請求它的中斷。軟盤(pán)設備驅動(dòng)正是使用的這種方式;它的中斷號總為6。有時(shí)設備驅動(dòng)也可能不知道設備使用的中斷號。對PCI設備驅動(dòng)來(lái)說(shuō)這不是什么大問(wèn)題,它們總是可以知道其中斷號。但對于ISA設備驅動(dòng)則沒(méi)有取得中斷號的方便方式。Linux通過(guò)讓設備驅動(dòng)檢測它們的中斷號來(lái)解決這個(gè)問(wèn)題。

設備驅動(dòng)首先迫使設備引起一個(gè)中斷。系統中所有未被分配的中斷都被使能。此時(shí)設備引發(fā)的中斷可以通過(guò)可編程中斷控制器來(lái)發(fā)送出去。Linux再讀取中斷狀態(tài)寄存器并將其內容返回給設備驅動(dòng)。非0結果則表示在此次檢測中有一個(gè)或多個(gè)中斷發(fā)生。設備驅動(dòng)然后將關(guān)閉檢測并將所有未分配中斷屏蔽掉。

如果ISA設備驅動(dòng)成功找到了設備的IRQ號,就可以象平常一樣請求對設備的控制。

基于PCI系統比基于ISA系統有更多的動(dòng)態(tài)性。ISA設備使用的中斷引腳通常是通過(guò)硬件設備上的跳線(xiàn)來(lái)設置并固定在設備驅動(dòng)中。PCI設備在系統啟動(dòng)與初始化PCI時(shí)由PCI BIOS或PCI子系統來(lái)分配中斷。每個(gè)PCI設備可以使用A,B,C或D之中的任意中斷。這個(gè)中斷在設備建立時(shí)確定且通常多數設備的缺省中斷為 A。PCI槽中的PCI中斷連線(xiàn)A,B,C和D被正確路由到中斷控制器中。所以PCI槽4上的引腳A可能被路由到中斷控制器上的引腳6,PCI槽7上的引腳B被路由到中斷控制器上的引腳7等等。

如何路由PCI中斷完全取決于特定的系統,一般設置代碼能理解PCI中斷路由拓撲。在基于Intel的PC上由系統BIOS代碼在啟動(dòng)時(shí)作這些設置而在不帶BIOS(如Alpha AXP)系統中由Linux核心來(lái)完成這個(gè)任務(wù)。

PCI設置代碼將每個(gè)設備對應的中斷控制器的引腳號寫(xiě)入PCI配置頭中。通過(guò)得到PCI中斷路由拓撲及設備的PCI槽號和PCI中斷引腳設置代碼可以確定其對應的中斷引腳(或IRQ)號。設備使用的中斷引腳被保存在此設備的PCI配置頭中為此目的保留的中斷連線(xiàn)域中。當運行設備驅動(dòng)時(shí)這些信息被讀出并用來(lái)控制來(lái)自L(fǎng)inux核心的中斷請求。

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

 

7.3  中斷處理

 


圖7.2 Linux中斷處理數據結構

 

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

中斷發(fā)生時(shí)Linux首先讀取系統可編程中斷控制器中中斷狀態(tài)寄存器判斷出中斷源,將其轉換成irq_action數組中偏移值。例如中斷控制器引腳6來(lái)自軟盤(pán)控制器的中斷將被轉換成對應于中斷處理過(guò)程數組中的第7個(gè)指針。如果此中斷沒(méi)有對應的中斷處理過(guò)程則Linux核心將記錄這個(gè)錯誤,不然它將調用對應此中斷源的所有irqaction數據結構中的中斷處理例程。

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


File translated from TEX by TTH, version 1.0.
Top of ChapterTable of ContentsShow FramesNo Frames
1996-1999 David A Rusling copyright notice.
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
關(guān)于 msi中斷優(yōu)勢
pci 學(xué)習筆記
DMA
玩轉電腦必看知識——各種BIOS設置詳解
第六章 PCI
淺談Linux PCI設備驅動(dòng)(二)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久