中斷描述符表

2021-05-26 14:48:25 字數 2092 閱讀 5199

中斷描述表是乙個系統表,它與每乙個中斷或異常向量相聯絡,每乙個向量在表中有相應的中斷或異常處理程式的入口位址。核心在允許中斷發生前,必須適當地初始化idt。

在第二章中,我們介紹了gdt和ldt,idt的格式與這兩種表的格式非常相似,表中的每一項對應乙個中斷或異常微量,每個向量由8個位元組組成。因此,最多需要256*8=2048位元組來存放idt。

idtr cpu暫存器使idt可以位於記憶體的任何地方,它指定idt的線性基位址及其限制。在允許中斷之間,必須有lidt彙編指令初始化idtr。

idt包含三種型別的描述符,圖4-2顯示了每種描述符中的64位的含義。尤其值得注意的是,在40-43位的type欄位的值表示描述符的型別。

這些描述符是:

任務門當中斷訊號發生時,必須取代當前程序的哪個程序的tss選擇符存放在任務門中。

中斷門包含段選擇符和中斷或異常處理程式的段內偏移量。當控制權轉移到乙個適當的段時,處理器清if標誌,從而關閉將來會發生的可遮蔽中斷。

陷阱門與中斷門相似,只要控制權傳遞到乙個適當的段時處理器不修改if標誌。

正如我們將在「中斷門、陷阱門及系統門」一節中所看到的那樣,linux利用中斷門處理中斷,利用陷阱門處理異常。

中斷和異常的硬體處理

我們現在描述cpu控制單元如何處理中斷和異常。我們假定核心已被初始化,因此,cpu在保護模式下執行。

當執行了一條指令後,cs和eip這對暫存器包含下一條將要執行的指令的邏輯位址。在處理哪條指令之前,控制單元會檢查在執行前一條指令時是否已經發生了乙個中斷或異常。如果發生了乙個中斷或異常,那麼控制單元執行下列操作:

(1)    確定與中斷或異常關聯的微量i

(2)    讀由idtr暫存器指向的idt表中的第i項。

(3)    從gdtr暫存器獲得gdt的基位址,並在gdt中查詢,以讀取idt表項中的選擇符所標識的段描述符。這個描述符指定中斷或異常處理程式所在段的基位址。

(4)    確信中斷是由授權的發生源發出的。首先將在當前特權級cpl與段描述符的描述符特權級dpl比較,如果cpl小於dpl,就產生乙個」general proection」異常,因為中斷處理程式的特權不能低於引起中斷的程式的特權。對於程式設計異常,則做進一步的安全檢查:比較cpl與處於idt中的門描述符的dpl,如果dpl小於cpl,就產生乙個」general protection」異常。這最後乙個檢查可以避免使用者應用程式訪問特殊的陷阱門或中斷門。

a.       讀tr暫存器,以訪問執行程序的tss段。

b.      用與新特權級相關的棧段和棧指標的正確值裝載ss和esp暫存器。這些值可以在tss中找到。

(6)    如果故障已發生,用引用異常的指令位址裝載cs和 eip暫存器,從而使得這條指令能再次被執行。

(7)    在棧中儲存eflags、cs及eip的內容。

(8)    如果異常產生了乙個硬體出錯碼,則將它儲存在棧中。

裝載cs和eip暫存器,其值分別為idt表中第i項門描述符的段選擇符和偏移量字段。這些值給出了中斷或者異常處理程式的第一條指令的邏輯位址。

控制單元所執行的最後一步就是跳轉到中斷或者異常處理程式。換句話說,處理完中斷訊號後,控制單元所執行的指令就是被選中處理程式的第一條指令。

中斷或異常被處理完後,相應的處理程式必須產生一條

iret

指令,把控制權交給被中斷的程序,這將迫使控制單元:

用儲存在棧中的值裝載cs、

eip或

eflags

暫存器。如果乙個硬體出錯碼曾被壓入棧中,並且在

eip內容的上面,那麼,執行

iret

指令前必須先彈出這個硬體出錯碼。

檢查處理程式的

cpu是否等於

cs中最低兩位的值。如果是,

iret

終止執行;否則,轉入下一步。

從棧中裝載ss和

esp暫存器,因此,返回到與舊特權級相關的棧。

檢查ds、es

、fs及gs

段暫存器的內容,如果其中乙個暫存器包含的選擇符是乙個段選擇符,並且其

dpl值小於

cpl,那麼,清相應的段暫存器。控制單元這麼做是為了禁止使用者態的程式利用核心以前所用的段暫存器。如果不清這些暫存器,懷有惡意的使用者態程式就可能利用它們來訪問核心位址空間。

彙編 設定中斷描述符表

操作的步驟如下 1 記錄中斷處理函式的段內偏移 2 獲取或指定段選擇子 3 對idt表賦值 本操作是對所有的中斷都採用同一的函式 myintfunc 處理 注 idt 中斷描述符表的基址 idt descr 中斷描述符操作的引數 圖示如下 63.55.47.39.31.23.15.7.0 myint...

驅動程式設計 idt hook 中斷描述符表

整理下之前過驅動保護的學習,idt hook也是乙個經常用到的hook思路。還是要用到inline hook進入到中斷函式位址進行jmp 獲取idt表位址 修改int3中斷函式 include include ifdef cplusplus extern c endif pragma pack pu...

全域性描述符表

局描述符表 gdt global descriptor table 在protected mode下,乙個重要的必不可少的資料結構就是gdt global descriptor table 中文名全域性描述符表 外文名global descriptor table 類 型 資料結構 領 域 科學技術...