追踨法蘭克

2015年8月8日 星期六

中斷描述表 & 中斷服務程式(IDT & ISR )

中斷描述表 (Interrupt Descriptor Table, IDT) 是 用來定義 IA-32 的系統架構。它是Protected mode 對應 Real Mode 的中斷向量表 ,它表列了 中斷服務程式 (Interrupt Service Routines, ISR). 它有點類似,Global Descriptor Table結構. 
IDT的Entry稱作 Gates. 包含了Interrupt Gates, Task Gates, Trap Gates.

位置與大小
IDT位於在CPU的IDTR暫存器,它可以經由LIDT, SIDT指令用來讀取和存取。

IDTR
NameBitDescription
Limit0..15Defines the length of the IDT in bytes - 1 (minimum value is 100h, a value of 1000h means 200h interrupts).
Base16..47This 32 bits are the linear address where the IDT starts (INT 0)


這相似於GDT, 例外:
  • 位於0~400 memory位址. (此位址用於IDT)
  • 總共256個中斷(0~255). 所以IDT應該有256個Entries. 每個Entry對應到一個特定的中斷 
  • 它可以包含 256 更多或更少 entries. 更多的 entries將被忽略。當一個中斷或例外被呼叫,但它的entry不存在,會產生GPF (General Protection Fault), 表示此IDT Entry的號碼是遺失的

結構:
這表包含 8-byte Gate entries. 每一個Enty有一個複雜的結構。
struct IDTDescr{
   uint16_t offset_1; // offset bits 0..15
   uint16_t selector; // a code segment selector in GDT or LDT
   uint8_t zero;      // unused, set to 0
   uint8_t type_attr; // type and attributes, see below
   uint16_t offset_2; // offset bits 16..31
};
它的offset 是一個32bit的數值。分別為兩個部分。
select是一個16bit的數值而且指向一個位於GDT的有效的select.
type_attr 定義如下:
7 0
+---+---+---+---+---+---+---+---+
| P | DPL | S | GateType |
+---+---+---+---+---+---+---+---+
IDT entry, Interrupt Gates
NameBitFull NameDescription
Offset48..63Offset 16..31Higher part of the offset.
P47PresentSet to 0 for unused interrupts or for Paging.
DPL45,46Descriptor Privilege LevelGate call protection. Specifies which privilege Level the calling Descriptor minimum should have. So hardware and CPU interrupts can be protected from beeing called out of userspace.
S44Storage SegmentSet to 0 for interrupt gates (see below).
Type40..43Gate Type 0..3Possible IDT gate types :
0b01010x5580386 32 bit task gate
0b01100x6680286 16-bit interrupt gate
0b01110x7780286 16-bit trap gate
0b11100xE1480386 32-bit interrupt gate
0b11110xF1580386 32-bit trap gate
032..39Unused 0..7Have to be 0.
Selector16..31Selector 0..15Selector of the interrupt function (to make sense - the kernel's selector). The selector's descriptor's DPL field has to be 0.
Offset0..15Offset 0..15Lower part of the interrupt function's offset address (also known as pointer).

1 則留言: