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

Linux 核心--8.中斷與中斷處理( 二 )



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


7.2初始化中斷處理數(shù)據(jù)結(jié)構(gòu)
核心的中斷處理數(shù)據(jù)結(jié)構(gòu)在設(shè)備驅(qū)動(dòng)請求系統(tǒng)中斷控制時(shí)建立 。為完成此項(xiàng)工作 , 設(shè)備驅(qū)動(dòng)使用一組Linux核心函數(shù)來請求中斷 , 使能中斷和屏蔽中斷 。
每個(gè)設(shè)備驅(qū)動(dòng)將調(diào)用這些過程來注冊其中斷處理例程地址 。

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

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

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

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

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

PCI設(shè)置代碼將每個(gè)設(shè)備對應(yīng)的中斷控制器的引腳號(hào)寫入PCI配置頭中 。通過得到PCI中斷路由拓?fù)浼霸O(shè)備的PCI槽號(hào)和PCI中斷引腳設(shè)置代碼可以確定其對應(yīng)的中斷引腳(或IRQ)號(hào) 。設(shè)備使用的中斷引腳被保存在此設(shè)備的PCI配置頭中為此目的保留的中斷連線域中 。當(dāng)運(yùn)行設(shè)備驅(qū)動(dòng)時(shí)這些信息被讀出并用來控制來自Linux核心的中斷請求 。

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


7.3中斷處理



圖7.2 Linux中斷處理數(shù)據(jù)結(jié)構(gòu)


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

推薦閱讀