萬盛學電腦網

 萬盛學電腦網 >> 服務器教程 >> linux中斷--中斷原理分析

linux中斷--中斷原理分析

   中斷之原理篇

  前言:

  中斷是計算機發展中一個重要的技術,它的出現很大程度上解放了CPU,提高了CPU的執行效率。

  在中斷出現之前,CPU對IO采用的是輪詢的方式進行服務,這使的CPU糾結在某一個IO上,一直在等待它的響應,如果它不響應,CPU就在原地一直的等下去。這樣就導致了其他IO口也在等待CPU的服務,如果某個IO出現了important or emergency affairs,CPU也抽不出身去響應這個IO。

  為了解決這個糾結的問題就------>出現了中斷

  中斷控制的主要優點是只有在IO接口需要服務時才去響應它,使得CPU很淡定的做它自己的事情,只有IO口有需求的時候才去響應它。同時中斷中也設計了中斷優先級,來處理一些很緊急的事件。

  一.中斷的基本知識

  1.中斷的概念:

  所謂中斷,是指CPU在正常運行程序時,由於程序的預先安排或內外部事件,引起CPU中斷正在運行的程序,而轉到發生中斷事件程序中。這些引起程序中斷的事件稱為中斷源。

  其實從物理學的角度看,中斷是一種電信號,由硬件設備產生,並直接送入中斷控制器(如 8259A)的輸入引腳上,然後再由中斷控制器向處理器發送相應的信號。處理器一經檢測到該信號,便中斷自己當前正在處理的工作,轉而去處理中斷。此後,處理器會通知 OS 已經產生中斷。這樣,OS 就可以對這個中斷進行適當的處理。不同的設備對應的中斷不同,而每個中斷都通過一個唯一的數字標識,這些值通常被稱為中斷請求線。

  2.那麼當產生一個中斷時,CPU是如何識別的呢?

  在Intel X86中可以支持256中向量中斷,為了使處理器能使別每種中斷源,給它們進行了編號----->叫做中斷向量

  3.這些中斷向量在Linux中是如何分配的:

  編號0~31的向量對應於異常和非屏蔽中斷(這類也屬於向量中斷或者內部中斷,向量中斷的特性就是一一映射,一個中斷向量對應一個中斷處理例程)

  編號32~47的向量(即由IO設備引起的中斷)分配給屏蔽中斷。(這類也屬於非向量中斷或者外部中斷,在Intel手冊中常說的就是這類中斷。非向量中斷的特性在下文就可以體現出來。)

  編號48~255的向量用來標示軟中斷。Linux用其中的128或0x80來實現系統調用(所以通過系統調用來進入內核空間都需要通過128中斷操作)

  非屏蔽中斷的向量和異常的向量是固定的。

  4.異常和中斷的區別:

  1>異常:是指CPU內部出現的中斷,即在CPU執行特定指令時出現的非法情況。同時異常也稱為同步中斷,因此只有在一條指令執行後才會發出中斷 ,不可能在指令執行期間發生異常。

  a.產生的原因:

  程序的錯誤產生的(eg:除數為0)

  內核必須處理的異常條件產生的(eg:缺頁)

  b.異常又分為故障和陷阱,它們都不使用中斷控制器,也不能被屏蔽

  C.X86處理處理器中大約有20中異常。Linux內核必須為每種異常提供一個專門的異常處理程序。

  2>中斷:也稱為異步中斷。因此它是由其他硬件設備依照 CPU 時鐘信號隨機產生,即意味著中斷能在指令之間發生。

  a.中斷又分為外部可屏蔽中斷(INTR)和外部非屏蔽中斷(NMI)

  所用I0設備產生的中斷請求均引起可屏蔽中斷

  硬件故障引起的故障則產生非屏蔽中斷。

  John說明:

  在CPU執行一個異常處理程序時,就不再響應其他異常和中斷請求服務.那麼如果此時發生了一個異常,CPU不能去響應它,又不能把它的信息丟失該怎麼辦呢?

  這是就用到了堆棧,把所有的信息壓入棧。等當前異常處理後,才從堆棧中取出信息再響應剛才的異常。(當產生多個非屏蔽中斷時,CPU的處理方法同上)

  二APIC和8259A

  中斷的實現也需要硬件上的支持的,那麼硬件上是如何支持中斷的?

  1.在X86計算機的 CPU 為中斷只提供了兩條外接引腳:NMI 和 INTR。

  NMI 是不可屏蔽中斷,它通常用於電源掉電和物理存儲器奇偶校驗;

  INTR是可屏蔽中斷,可以通過設置中斷屏蔽位來進行中斷屏蔽,它主要用於接受外部硬件的中斷信號,這些信號由中斷控制器傳遞給 CPU。

  2.中斷控制器

  目前常見的中斷控制器有可編程中斷控制器8259A和高級可編程中斷控制器(APIC)

  1>8259A

  PIC(Programmable Interrupt Controller)是由兩片 8259A 的外部芯片以“級聯”的方式連接在一起。每個芯片可處理多達 8 個不同的 IRQ(中斷請求線)。因為從 PIC 的 INT 輸出線連接到主 PIC 的 IRQ2 引腳,所以可用 IRQ 線的個數達到 15 個。

  我們來看一個圖:(進行看圖說明)

linux中斷--中斷原理分析  三聯

  a.第一級8259A是主中斷控制器,它的第二個中斷請求輸入端與第二級8259A的中斷輸出端INT相連。

  b.與中斷控制器相連的每條線叫做中斷線。要使用中斷線,就要進行中斷線的申請,即IRQ。

  那麼這條線的名字是啥勒----》中斷號。

  IRQ線是從0開始順序編號的,所以第一條IRQ線就是IRQ0。

  C.那麼該中斷號於我們上面所說的中斷向量有什麼關系呢

  中斷向量=中斷號+32。

  從此等式可以看出,第一個中斷線(IR0)所對應的中中斷向量是32.

  由此可以得出:

  (1)異常和非屏蔽向量是CPU 內部引起的中斷

  (2)向量32-47對應的是外部中斷。

  d.並不是每個設備都可以向中斷線上發中斷信號,只有對某一條確定的中斷線擁有了控制權後,才可以向這條中斷線上發送信號。

  e.8259A中還有一個很重要的寄存器->8位的中斷屏蔽寄存器->這個寄存器的作用是屏蔽中斷。

  8位的中斷屏蔽寄存每一位對應8259A中的一條中斷線,如果要禁用某條中斷線,則把中斷屏蔽寄存器的相應位置1,要啟用則置0。

  (PS:看到這裡就可以明白,需要用到中斷控制器的中斷都是外部中斷,也就是可屏蔽中斷。每個IRQ對應一個中斷向量。但是並不是每一個中斷向量都可以對應一個IRQ)

  John哥說明:

  屏蔽中斷也可以從CPU的角度考慮,即清除eflag的中斷標志位(IF),當IF位為0時禁止任何外部IO的中斷請求,即關中斷;

  f.共享中斷(一個很重要的概念,後面程序中會涉及到它)

  由於計算機的外部設備越來越多,所以15條中斷線已經不夠用了。中斷線是很寶貴的資源,為了更好的利用它,只有當設備需要中斷的時候才申請占用一個IRQ,並且為了讓更多的設備使用中斷采取了在申請IRQ時采用共享中斷的方式。

  (PS:由於外部設備多,多個設備可以對應同一個IRQ,也就是對應同一個中斷向量,一個中斷向量對應一個中斷處理程序,但是一個中斷處理程序可能對應很多中斷服務例程)

  2>高級可編程中斷控制器(APIC)

  先看圖再說:

  1.8259A 只適合單 CPU 的情況,為了充分挖掘 SMP 體系結構的並行性,能夠把中斷傳遞給系統中的每個 CPU 至關重要。基於此理由,Intel 引入了一種名為 I/O 高級可編程控制器的新組件,來替代老式的 8259A 可編程中斷控制器。該組件包含兩大組成部分:一是“本地 APIC”,主要負責傳遞中斷信號到指定的處理器;舉例來說,一台具有三個處理器的機器,則它必須相對的要有三個本地 APIC。另外一個重要的部分是 I/O APIC,主要是收集來自 I/O 裝置的 Interrupt 信號且在當那些裝置需要中斷時發送信號到本地 APIC(相當於一個路由的功能),系統中最多可擁有 8 個 I/O APIC。

  2.每個本地 APIC 都有 32 位的寄存器,一個內部時鐘,一個本地定時設備以及為本地中斷保留的兩條額外的 IRQ 線 LINT0 和 LINT1。所有本地 APIC 都連接到 I/O APIC,形成一個多級 APIC 系統。

  那麼我們如何知道我們機子上使用的是那種中斷控制器呢?

  我們可以通過在終端出入命令:cat /proc/interrupts來查看

  a.若看到列表中有IO-APIC,說明您的系統正在使用 APIC。

  若看到 XT-PIC,意味著您的系統正在使用 8259A 芯片。

  16位實地址模式的中斷機制和32位保護模式的中斷機制的最本質差別就是在保護模式下引入了中斷描述表

  在單處理器的系統中,第一列是中斷號,第二列是CPU產生該中斷的次數。最後一列是於這個中斷相關的俄設備名字。這個名字是通過參數devname提供給函數request_irq()(下篇文章會對它講解)

  三.中斷描述表

  1.為什麼引入

  在實地址模式中,CPU把內存中從0開始的1kb空間作為一個中斷向量表。表中的每個表項占四個字節,由兩個字節的段地址和兩個字節的偏移量組成,這樣構成的地址就是相應中斷處理程序的入口地址。

  但是在保護模式下,由4個字節的表項構成的中斷向量表已經不能滿足要求了。在保護模式下,中斷向量表中的表項由8個字節組成。此時他也有了新的名字---->中斷描述表(Interrupt Descriptor Table,IDT)(PS:總共有256個描述符,每個描述符8字節,256*8就是中斷描述符占用的字節空間),其中的每個表項叫做一個門描述符(great descriptor)(在中斷系列的其他文章中有很詳細的介紹各種門描述符,系統所有

copyright © 萬盛學電腦網 all rights reserved