中斷描述符(IDT) 任務門 中斷門 陷阱門

2021-08-21 12:21:15 字數 2370 閱讀 2060

中斷描述符idt表示乙個系統表,它與中斷或異常向量相聯絡。每乙個中斷或異常向量在這個系統表中有對應的中斷或異常處理程式入口位址。中斷描述符的每一項對應乙個中斷或異常向量,每個向量由8個位元組組成。因此,最多需要256*8=2048位元組來存放idt。

在執行中斷之前,必須初始化idt(中斷描述符表)。

idt包含三種型別的中斷描述符:任務門、中斷門、陷阱門。描述符的第40~43位用於區分不同的描述符(每個描述符有8個位元組/64bit)。

任務門(task gate)

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

中斷門(interruptgate)

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

陷阱門(trap gate)

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

以上為intel對中斷描述符的分類。linux採用了更細的分類方法

中斷門(interrupt gate)

使用者態的程序不能訪問的乙個lntel中斷門(門的dpl欄位為0)。所有的linux中斷處理程式都通過中斷門啟用,並全部限制在核心態。

系統門(syslem gate)

使用者態的程序可以訪問的乙個intel陷阱門(門的dpl欄位為到.通過系統門來啟用三個linux異常處理程式,它們的向量是4,5及128,因此,在使用者態下.可以發布into、 bound及int $ox80三條組合語言指令。

系統中斷門(system interrupt gate)

能夠被使用者態程序訪問的intel中斷門(門的dpl欄位為3). 與向量3相關的異常處理程式是由系統中斷門啟用的,因此,在使用者態可以使用組合語言指令int3.

陷阱門(irapgate)

使用者態的程序不能訪問的乙個inte)陷阱門(f]的dpl欄位為0). 大部分linux異常處理程式都通過陷阱門來啟用.

任務門(task gate)

不能被使用者態程序訪問的intel任務門(門的dpl欄位為0).linux對"doublefault"異常的處理程式是由任務門啟用的.

核心啟用中斷以前;必須把idt表的初始位址裝入idtr暫存器,並初始化表中的每一項.這項工作是在初始化系統時完成的。

int指令允許使用者程序發出乙個中斷訊號(值為0~255的任意乙個向量),為了防止使用者通過int指令模擬非益的中斷和異常,idt初始化時必須把特殊的中斷或陷阱門描述符的dpl欄位設定成0。這樣,當程序試圖發出其中的乙個中斷訊號(特殊的中斷或陷阱門).控制單元就會檢查出cpl(當前特權級)的值與dpl欄位有衝突.並且產生乙個general protection" 異常。

然而,在少數情況下,使用者態程序必須能發出乙個編輯異常.為此,只要把中斷或陷阱門描述符的dpl欄位設定成3,即特權級盡可能一樣高就足夠了。

idt的初步初始化:

當計算機還執行在實模式時.idt被初始化並由bios例程使用.然而.一旦linux接管.idt就被移到ram的另乙個區域,並進行第二次初始化,因為linux沒有利用任何bios例程

idt存放在idt_table表中.有256個表項。6位元組的idt_descr變數指定了idt的大小和它的位址,只有當核心用lidt彙編指令初始化idtr暫存器時才用到這個變數

在核心初始化過程中,setup_idt ( )組合語言函式用同乙個中斷門(即指向ignore_int( )中斷處理程式)來填充所有這256個idt_table表項。

用組合語言寫成的ignore_int( )中斷處理程式,可以看作乙個空的處理程式,它執行

下列動作:

1.  在棧中儲存一些暫存器的內容。

2.  呼叫printk()函式列印"unknowninterrupt" 系統訊息.

3.  從棧恢復暫存器的內容。

4.  執行iret指令以恢復被中斷的程式。

ignore_int()處理程式應該從不被執行,在控制台或日誌檔案中出現的"unknown interrupt"訊息標誌著要麼是出現了乙個硬體的問題(乙個1/0裝置正在產生沒有預料到的中斷),要麼就是出現了乙個核心的問題(乙個中斷或異常未被適當地處理)。

緊接著這個預初始化,核心將在idt中進行第二遍初始化,用有意義的陷阱和中斷處理程式替換這個空處理程式。一且這個過程完成,對控制單元產生的每個不同的異常,idt都有乙個專門的陷阱或系統門.而對於可程式設計中斷控制器確認的每乙個irq, idt都將包含乙個專門的中斷門.

呼叫門描述符

門描述符跟段描述符的結構不同。2.它定義了在指定 段例程的入口點 偏移 3.它指定了呼叫者嘗試去訪問例程所需要的特權級 dpl 這裡是訪問者所要具備的特權級 4.如果發生了棧切換,它指定了拷貝到新棧的可選引數的數量 5位最多32個 也就是說,在跳到r0執行相應例程的時候,特權級便了,使用的棧也會改變...

中斷描述符表

中斷描述表是乙個系統表,它與每乙個中斷或異常向量相聯絡,每乙個向量在表中有相應的中斷或異常處理程式的入口位址。核心在允許中斷發生前,必須適當地初始化idt。在第二章中,我們介紹了gdt和ldt,idt的格式與這兩種表的格式非常相似,表中的每一項對應乙個中斷或異常微量,每個向量由8個位元組組成。因此,...

中斷向量表 和 中斷描述符 關係

在實模式下,從位址 0 開始的 1kb 大小記憶體構成乙個中斷向量表,表中每一項包括 4 個位元組,對應一 個中斷向量,儲存了該中斷向量所對應中斷處理程式的入口位址,如圖 6.4 所示。進入保護模式後,中斷向量表改名為中斷描述符表 interrupt descriptor table,idt 並允許...