講到中斷的硬體環境,我們先從著名的irq訊號談起。每個能夠發出中斷請求的硬體裝置控制器都有一條名為irq的輸出線。所有現有的irq線都與乙個名為可程式設計中斷控制器(pic)的硬體電路的輸入引腳相連,可程式設計中斷控制器執行下列動作:
1. 監視irq線,檢查產生的訊號。如果有條或兩條以上的irq線上產生訊號,就選擇引腳編號較小的irq線。
2. 如果乙個引發訊號出現在irq線上:
我們前邊談到,中斷系統的主要目的就是改變程式的執行順序。具體如何改變?也就是乙個呼叫中斷處理程式的過程,這裡我們就要引出中斷描述符表了。中斷描述符表(interrupt descriptor table,idt)是乙個系統表,它與每乙個中斷或異常向量相聯絡,每乙個向量在表中有相應的中斷或異常處理程式的入口位址。核心在允許中斷發生前,必須適當地初始化idt。
idt是乙個向量表,表中的每一項對應乙個中斷或異常向量,每個向量由8個位元組組成。因此,最多需要256 × 8=2048位元組來存放idt,正好是半個頁面。那麼,這個idt到底放在什麼位置呢?有了idtr cpu暫存器,idt就可以位於記憶體的任何地方。idtr暫存器指定idt的線性基位址及其限制(最大長度)。在允許中斷之前,必須用lidt彙編指令初始化idtr。
idt包含三種型別的描述符,下圖顯示了每種描述符中的64位(8個位元組)的含義。尤其值得注意的是,在40~43位的type欄位的值表示三種描述符的型別。
好了,有了前面的基本概念後,我們現在開始分析cpu控制單元如何處理中斷和異常。我們假定核心已被初始化,因此,cpu在保護模式下執行。當執行了一條指令後,cs和eip這對暫存器包含下一條將要執行的指令的邏輯位址。在處理那條指令之前,控制單元會檢查在執行前一條指令時是否已經發生了乙個中斷或異常。如果發生了乙個中斷或異常,那麼控制單元執行下列操作:
1. 確定與中斷或異常關聯的向量i (0 ≤ i ≤ 255)。
2. 讀由idtr暫存器指向的 idt表中的第i項(在下面的分析中,我們假定idt表項中包含的是乙個中斷門或乙個陷阱門)。
3. 從gdtr暫存器獲得gdt的基位址,並在gdt中查詢,以讀取idt表項中的選擇符所標識的段描述符。這個描述符指定中斷或異常處理程式所在段的基位址。
4. 確信中斷是由授權的(中斷)發生源發出的。首先將當前特權級cpl(存放在cs暫存器的低兩位)與段描述符(存放在gdt中)的描述符特權級dpl比較,如果cpl小於dpl,就產生乙個「general protection」異常,因為中斷處理程式的特權不能低於引起中斷的程式的特權。對於程式設計異常,則做進一步的安全檢查:比較cpl與處於idt中的門描述符的dpl,如果dpl小於cpl,就產生乙個「general protection」異常。這最後乙個檢查可以避免使用者應用程式訪問特殊的陷阱門或中斷門。
5. 檢查是否發生了特權級的變化,也就是說,cpl是否不同於所選擇的段描述符的dpl。如果是,控制單元必須開始使用與新的特權級相關的棧。通過執行以下步驟來做到這點:
i. 讀tr暫存器,以訪問執行程序的tss段。
ii. 用與新特權級相關的棧段和棧指標的正確值裝載ss和esp暫存器。這些值可以在tss中找到(參見第三章的「任務狀態段」一節)
iii. 在新的棧中儲存ss和esp以前的值,這些值定義了與舊特權級相關的棧的邏輯位址。
6. 如果故障已發生,用引起異常的指令位址裝載cs和eip暫存器,從而使得這條指令能再次被執行。
7. 在棧中儲存eflags、cs及eip的內容。
8. 如果異常產生了乙個硬體出錯碼,則將它儲存在棧中。
9. 裝載cs和eip暫存器,其值分別是idt表中第i項門描述符的段選擇符和偏移量字段。這些值給出了中斷或者異常處理程式的第一條指令的邏輯位址。
控制單元所執行的最後一步就是跳轉到中斷或者異常處理程式。換句話說,處理完中斷訊號後,控制單元所執行的指令就是被選中處理程式的第一條指令。
中斷或異常被處理完後,相應的處理程式必須產生一條iret指令,把控制權轉交給被中斷的程序,這將迫使控制單元:
1. 用儲存在棧中的值裝載cs、eip或eflags暫存器。如果乙個硬體出錯碼曾被壓入棧中,並且在eip內容的上面,那麼,執行iret指令前必須先彈出這個硬體出錯碼。
2. 檢查處理程式的cpl是否等於cs中最低兩位的值(這意味著被中斷的程序與處理程式執行在同一特權級)。如果是,iret終止執行;否則,轉入下一步。
3. 從棧中裝載ss和esp暫存器,因此,返回到與舊特權級相關的棧。
4. 檢查ds、es、fs及gs段暫存器的內容,如果其中乙個暫存器包含的選擇符是乙個段描述符,並且其dpl值小於cpl,那麼,清相應的段暫存器。控制單元這麼做是為了禁止使用者態的程式(cpl=3)利用核心以前所用的段暫存器(dpl=0)。如果不清這些暫存器,懷有惡意的使用者態程式就可能利用它們來訪問核心位址空間。
x86中斷(一) 中斷分類
一 中斷分類 x86系統支援256個中斷源,每個中斷源使用0 255數字標識,該標識稱作中斷向量號 即cpu中斷源的中斷號,要與外部中斷的中斷號irq n相區別 cpu通過獲取中斷向量號識別中斷源。256個中斷源可以分為 其中 1 內部中斷 由cpu內部事件及執行軟中斷指令產生,由除法中斷 溢位中斷...
6 中斷系統
外部中斷0實驗 include reg52.h 此檔案中定義了微控制器的一些特殊功能暫存器 typedef unsigned int u16 對資料型別進行宣告定義 typedef unsigned char u8 sbit k3 p3 2 定義按鍵k3 sbit led p2 0 定義p20口是l...
029 中斷註冊
按鍵按下 產生了中斷 跳轉到異常向量入口,執行中斷函式。中斷函式要做的工作 1 保護現場 2 執行中斷處理函式 3 恢復現場 request irq unsigned int irq,irq handler t handler,unsigned long flags,const char name,...