技術(shù)員聯(lián)盟提供win764位系統(tǒng)下載,win10,win7,xp,裝機(jī)純凈版,64位旗艦版,綠色軟件,免費(fèi)軟件下載基地!

當(dāng)前位置:主頁(yè) > 教程 > 服務(wù)器類 >

linux中斷--中斷原理分析

來(lái)源:技術(shù)員聯(lián)盟┆發(fā)布時(shí)間:2018-08-15 18:03┆點(diǎn)擊:

  中斷之原理篇

  前言:

  中斷是計(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è)。