1.定義
中斷通常定義爲一個事件,該事件改變處理器執行的指令順序。中斷通常分爲同步中斷與異步中斷。
- 同步中斷:當指令執行時由CPU控制單元產生的,只有在一條指令終止執行後CPU纔會發出中斷。
- 異步中斷:由其他硬件設備依照CPU時鐘信號隨機產生的。
異常是同步的,I/O中斷是異步的。
2.中斷與異常
中斷可以分爲:
- 可屏蔽中斷
I/O設備發出的中斷請求(IRQ)都可以被屏蔽,一箇中斷被屏蔽以後,控制單元就忽略他。
- 非屏蔽中斷
只有硬件故障等幾個危急事件纔是非屏蔽中斷。
異常可以分爲:
- 故障
可以糾正的異常,例如缺頁異常等。eip保存的是引起故障的指令地址,故障修復以後,該指令還會被執行一次。
- 陷進
例如斷點。eip中保存的一個隨後要執行的指令地址,異常指令不會被重複執行
- 中止
發生嚴重錯誤,不能再eip中保存確切的異常指令的位置,強制終止受影響的進程。
3.IRQ和中斷
當一個CPU接收到一箇中斷時,如何知道是哪個硬件的中斷?
根據該中斷的中斷向量號在中斷描述表中檢索對應的描述符,根據中斷描述符中的段選擇符以及段偏移量找到中斷處理程序的起始地址,然後執行中斷處理程序。
那麼,中斷向量是什麼???中斷描述符表又是什麼???
中斷向量的確定:
每個能發出中斷請求的硬件設備控制器都有一條名爲IRQ的輸出線,該線與可編程中斷控制器(Programmable Interrupt Controuer,PIC)的輸入引腳相連。該中斷控制器可以根據產生中斷信號的不同的IRQ線轉換成對應的中斷向量,然後CPU通過數據總線讀取此向量。
中斷向量由256個,分佈如下所示(圖片節選自《深入理解LINUX內核》)
如上表所示,物理IRQ可以分配給32~238範圍內的任何向量,128被用來實現系統調用。IBM PC兼容的體系結構要求一些設備必須被靜態的連接到指定的IRQ線,尤其是:
- 間隔定時的設備必須連接到IRQ0線
- 從8259A PIC必須與IRQ2線相連接
- 必須把外部數字協會粗利器連接到IRQ13線
- 一般而言,一個I/O設備可以連接到有限個IRQ線
下表顯示了設備和IRQ之間一種相當隨意的安排。
異常的中斷向量分佈如下:
4.中斷描述符
中斷描述符表(Interrupt Descriptor Table,IDT)是一個系統表,它與中斷異常向量相聯繫,每一箇中斷向量在表中有相應的中斷或異常處理程序的入口地址。內核在允許中斷髮生前,必須適當的初始化IDT。
IDT包含三種類型的描述符,如下表所示:
描述符是:
任務門(task gate)
當中斷信號發生時,必須取代當前進程的那個進程的TSS選擇符存放在任務門中
中斷門(interrupt gate)
包含段選擇符和中斷或異常處理程序的段內偏移量。當控制權傳遞到一個適合的段時,清IF標誌,關中斷。
陷進門(trap gate)
與中斷門相似,只不過傳遞控制權以後,不清IF標誌。
5.中斷和異常的硬件處理
3中簡要介紹了中斷異常處理的流程,並在3,4中簡介了中斷向量與中斷描述符表,現在詳細介紹下中斷異常的處理流程。
當CPU執行了一條指令後,cs和eip這對寄存器包含下一條將要執行的指令的邏輯地址。在處理這條指令之前,控制單元會檢查在運行前一條指令時是否已經發生了一箇中斷或異常(控制單元是輪詢是否有中斷髮生)。如果發生了一箇中斷或異常:
- 確定中斷或異常的中斷系向量i(0<=i<=255)
- 讀由idtr寄存器指向的IDT表中的第i項(假設該項是中斷門或者陷進門)
- 從gdtr寄存器過得GDT的基地址,該基地址指向中斷處理程序所在段的基地址
- 確信中斷是由授權的發生源發出的。將當前特權級CPL(存放在cs寄存器的低兩位)與段描述符(存放在GDT中)的描述符特權級CPL比較
- 檢查是否發生了特權級的變化
- 如果發生了故障,在cs和eip裝載引起異常的指令地址,以使得故障恢復後異常指令能夠再次被執行
- 在棧中保存eflags,cs及eip的內容
- 裝載cs和eip寄存器,其值分別是IDT表中第i項門描述符的段選擇符和偏移量子段。
- 跳轉執行中斷異常處理程序
中斷異常處理完以後,相應的處理程序必須產生一條iret指令,把控制權轉交給被中斷的進程。
6.中斷優先級
PIC模式IRQ數目越低意味着優先級越高。在APIC模式下,IOAPIC連接的24個IRQ是平權的,決定優先級的是對應的中斷向量的大小,中斷向量有256,中斷優先級的計算公式:
優先級=vector num/16
即每16箇中斷或異常一組,共享一個優先級,共16個。32以下的中斷向量被異常和保留佔據,因此2到15是中斷的優先級。