中斷之原理篇
前言:
中斷是計(jì)算機(jī)發(fā)展中一個(gè)重要的技術(shù),它的出現(xiàn)很大程度上解放了CPU,提高了CPU的執(zhí)行效率。
在中斷出現(xiàn)之前,CPU對(duì)IO采用的是輪詢的方式進(jìn)行服務(wù),這使的CPU糾結(jié)在某一個(gè)IO上,一直在等待它的響應(yīng),如果它不響應(yīng),CPU就在原地一直的等下去。這樣就導(dǎo)致了其他IO口也在等待CPU的服務(wù),如果某個(gè)IO出現(xiàn)了important or emergency affairs,CPU也抽不出身去響應(yīng)這個(gè)IO。
為了解決這個(gè)糾結(jié)的問(wèn)題就------>出現(xiàn)了中斷
中斷控制的主要優(yōu)點(diǎn)是只有在IO接口需要服務(wù)時(shí)才去響應(yīng)它,使得CPU很淡定的做它自己的事情,只有IO口有需求的時(shí)候才去響應(yīng)它。同時(shí)中斷中也設(shè)計(jì)了中斷優(yōu)先級(jí),來(lái)處理一些很緊急的事件。
一.中斷的基本知識(shí)
1.中斷的概念:
所謂中斷,是指CPU在正常運(yùn)行程序時(shí),由于程序的預(yù)先安排或內(nèi)外部事件,引起CPU中斷正在運(yùn)行的程序,而轉(zhuǎn)到發(fā)生中斷事件程序中。這些引起程序中斷的事件稱為中斷源。
其實(shí)從物理學(xué)的角度看,中斷是一種電信號(hào),由硬件設(shè)備產(chǎn)生,并直接送入中斷控制器(如 8259A)的輸入引腳上,然后再由中斷控制器向處理器發(fā)送相應(yīng)的信號(hào)。處理器一經(jīng)檢測(cè)到該信號(hào),便中斷自己當(dāng)前正在處理的工作,轉(zhuǎn)而去處理中斷。此后,處理器會(huì)通知 OS 已經(jīng)產(chǎn)生中斷。這樣,OS 就可以對(duì)這個(gè)中斷進(jìn)行適當(dāng)?shù)奶幚怼2煌脑O(shè)備對(duì)應(yīng)的中斷不同,而每個(gè)中斷都通過(guò)一個(gè)唯一的數(shù)字標(biāo)識(shí),這些值通常被稱為中斷請(qǐng)求線。
2.那么當(dāng)產(chǎn)生一個(gè)中斷時(shí),CPU是如何識(shí)別的呢?
在Intel X86中可以支持256中向量中斷,為了使處理器能使別每種中斷源,給它們進(jìn)行了編號(hào)----->叫做中斷向量
3.這些中斷向量在Linux中是如何分配的:
編號(hào)0~31的向量對(duì)應(yīng)于異常和非屏蔽中斷(這類也屬于向量中斷或者內(nèi)部中斷,向量中斷的特性就是一一映射,一個(gè)中斷向量對(duì)應(yīng)一個(gè)中斷處理例程)
編號(hào)32~47的向量(即由IO設(shè)備引起的中斷)分配給屏蔽中斷。(這類也屬于非向量中斷或者外部中斷,在Intel手冊(cè)中常說(shuō)的就是這類中斷。非向量中斷的特性在下文就可以體現(xiàn)出來(lái)。)
編號(hào)48~255的向量用來(lái)標(biāo)示軟中斷。Linux用其中的128或0x80來(lái)實(shí)現(xiàn)系統(tǒng)調(diào)用(所以通過(guò)系統(tǒng)調(diào)用來(lái)進(jìn)入內(nèi)核空間都需要通過(guò)128中斷操作)
非屏蔽中斷的向量和異常的向量是固定的。
4.異常和中斷的區(qū)別:
1>異常:是指CPU內(nèi)部出現(xiàn)的中斷,即在CPU執(zhí)行特定指令時(shí)出現(xiàn)的非法情況。同時(shí)異常也稱為同步中斷,因此只有在一條指令執(zhí)行后才會(huì)發(fā)出中斷 ,不可能在指令執(zhí)行期間發(fā)生異常。
a.產(chǎn)生的原因:
程序的錯(cuò)誤產(chǎn)生的(eg:除數(shù)為0)
內(nèi)核必須處理的異常條件產(chǎn)生的(eg:缺頁(yè))
b.異常又分為故障和陷阱,它們都不使用中斷控制器,也不能被屏蔽
C.X86處理處理器中大約有20中異常。Linux內(nèi)核必須為每種異常提供一個(gè)專門(mén)的異常處理程序。
2>中斷:也稱為異步中斷。因此它是由其他硬件設(shè)備依照 CPU 時(shí)鐘信號(hào)隨機(jī)產(chǎn)生,即意味著中斷能在指令之間發(fā)生。
a.中斷又分為外部可屏蔽中斷(INTR)和外部非屏蔽中斷(NMI)
所用I0設(shè)備產(chǎn)生的中斷請(qǐng)求均引起可屏蔽中斷
硬件故障引起的故障則產(chǎn)生非屏蔽中斷。
John說(shuō)明:
在CPU執(zhí)行一個(gè)異常處理程序時(shí),就不再響應(yīng)其他異常和中斷請(qǐng)求服務(wù).那么如果此時(shí)發(fā)生了一個(gè)異常,CPU不能去響應(yīng)它,又不能把它的信息丟失該怎么辦呢?
這是就用到了堆棧,把所有的信息壓入棧。等當(dāng)前異常處理后,才從堆棧中取出信息再響應(yīng)剛才的異常。(當(dāng)產(chǎn)生多個(gè)非屏蔽中斷時(shí),CPU的處理方法同上)
二APIC和8259A
中斷的實(shí)現(xiàn)也需要硬件上的支持的,那么硬件上是如何支持中斷的?
1.在X86計(jì)算機(jī)的 CPU 為中斷只提供了兩條外接引腳:NMI 和 INTR。
NMI 是不可屏蔽中斷,它通常用于電源掉電和物理存儲(chǔ)器奇偶校驗(yàn);
INTR是可屏蔽中斷,可以通過(guò)設(shè)置中斷屏蔽位來(lái)進(jìn)行中斷屏蔽,它主要用于接受外部硬件的中斷信號(hào),這些信號(hào)由中斷控制器傳遞給 CPU。
2.中斷控制器
目前常見(jiàn)的中斷控制器有可編程中斷控制器8259A和高級(jí)可編程中斷控制器(APIC)
1>8259A
PIC(Programmable Interrupt Controller)是由兩片 8259A 的外部芯片以“級(jí)聯(lián)”的方式連接在一起。每個(gè)芯片可處理多達(dá) 8 個(gè)不同的 IRQ(中斷請(qǐng)求線)。因?yàn)閺?PIC 的 INT 輸出線連接到主 PIC 的 IRQ2 引腳,所以可用 IRQ 線的個(gè)數(shù)達(dá)到 15 個(gè)。