日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Linux 核心--8.中斷與中斷處理

第七章 中斷及中斷處理

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






圖7.1 中斷路由的邏輯圖

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

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

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

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

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

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


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

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

推薦閱讀