中斷描述符表
中斷描述符表
中斷描述符表(Interrupt Descriptor Table,IDT)將每個異常或中斷向量分別與它們的處理過程聯繫起來。與GDT和LDT表類似,IDT也是由8位元組長描述符組成的一個數組。
目錄
中斷描述符表
可以包含描述符。為了構成IDT表中的一個索引值,處理器把異常或中斷的向量號乘以8。因為最多只有256個中斷或異常向量,所以IDT無需包含多於256個描述符。IDT中可以含有少於256個描述符,因為只有可能發生的異常或中斷才需要描述符。不過IDT中所有空描述符項應該設置其存在位(標誌)為0。
IDT表可以駐留在線性地址空間的任何地方,處理器使用IDTR寄存器來定位IDT表的位置。這個寄存器中含有IDT表32位的基地址和16位的長度(限長)值。IDT表基地址應該對齊在8位元組邊界上以提高處理器的訪問效率。限長值是以位元組為單位的IDT表的長度。
中斷描述符表IDT和寄存器IDTR
LIDT和SIDT指令分別用於載入和保存IDTR寄存器的內容。LIDT指令用於把內存中的限長值和基地址操作數載入到IDTR寄存器中。該指令僅能由當前特權級CPL是0的代碼執行,通常被用於創建IDT時的操作系統初始化代碼中。SIDT指令用於把IDTR中的基地址和限長內容複製到內存中。該指令可在任何特權級上執行。
如果中斷或異常向量引用的描述符超過了IDT的界限,處理器會產生一個一般保護性異常
在實地址模式中,CPU把內存中從0開始的1K位元組作為一個中斷向量表。表中的每個表項佔四個位元組,由兩個位元組的段地址和兩個位元組的偏移量組成,這樣構成的地址便是相應中斷處理程序的入口地址。但是,在保護模式下,由四位元組的表項構成的中斷向量表顯然滿足不了要求。這是因為,除了兩個位元組的段描述符,偏移量必用四位元組來表示;‚要有反映模式切換的信息。因此,在保護模式下,中斷向量表中的表項由8個位元組組成,中斷向量表也改叫做中斷描述符表IDT(InterruptDescriptor Table)。其中的每個表項叫做一個門描述符(gate descriptor),“門”的含義是當中斷髮生時必須先通過這些門,然後才能進入相應的處理程序。
主要門描述符是:
· 中斷門(Interrupt gate)
其類型碼為110,中斷門包含了一個中斷或異常處理程序所在段的選擇符和段內偏移量。當控制權通過中斷門進入中斷處理程序時,處理器清IF標誌,即關中斷,以避免嵌套中斷的發生。中斷門中的DPL(Descriptor Privilege Level)為0,因此,用戶態的進程不能訪問Intel的中斷門。所有的中斷處理程序都由中斷門激活,並全部限制在內核態。
· 陷阱門(Trap gate)
其類型碼為111,與中斷門類似,其唯一的區別是,控制權通過陷阱門進入處理程序時維持IF標誌位不變,也就是說,不關中斷。
· 系統門(System gate)
這是Linux內核特別設置的,用來讓用戶態的進程訪問Intel的陷阱門,因此,門描述符的DPL為3。通過系統門來激活4個Linux異常處理程序,它們的向量是3、4、5及128,也就是說,在用戶態下,可以使用int3、into、bound 及int0x80四條彙編指令。
最後,在保護模式下,中斷描述符表在內存的位置不再限於從地址0開始的地方,而是可以放在內存的任何地方。為此,CPU中增設了一個中斷描述符表寄存器IDTR,用來存放中斷描述符表在內存的起始地址。中斷描述符表寄存器IDTR是一個48位的寄存器,其低16位保存中斷描述符表的大小,高32位保存IDT的基址.