中斷實現的基本原理


前言:

中斷是計算機發展中一個重要的技術,它的出現很大程度上解放了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設備引起的中斷)分配給屏蔽中斷。

編號48~255的向量用來標示軟中斷。Linux用其中的128或0x80來實現系統調用

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

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 個。

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

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。

 

https://blog.csdn.net/aobama12/article/details/61632815


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM