一、中断描述符表IDT
1.中断描述符表IDT是一个系统表,它与每一个中断或异常向量相联系,每一个向量在表中有相应的中断或异常处理程序的入口地址。内核在允许中断发生前,必须适当的初始化IDT.
2.IDTR寄存器可以使IDT位于内存的任何地方,它制定IDT的线性基地址及其限制(最大长度)。可以通过sidt汇编语句获得IDT的基地址及限制长度。
3.表中的每一项对应一个中断或异常向量,每个向量由8个字节组成,最多需要256*8=2048个字节来存放IDT。表中的每一项由如下所示:
(1)16-31共16位是中断处理程序所在的段选择符。
(2)0-15位和48-64位组合起来形成32位偏移量,也就是中断处理程序所在段(由16-31位给出)的段内偏移。
(3)40-43位共4位表示描述符的类型。(0111:中断描述符,1010:任务门描述符,1111:陷阱门描述符)
(4)45-46两位标识描述符的访问特权级(DPL,Descriptor Privilege Level)。
(5)47位标识段是否在内存中。如果为1则表示段当前不再内存中。
4. linux内核的中断描述符表IDT是一个全局的数据,在x86平台上被定义为:
gate_desc
idt_table[NR_VECTORS] __page_aligned_bss;
#define NR_VECTORS
256
其中每一个表项均是一个desc_struct结构,该结构被定以为:
typedef struct desc_struct
gate_desc;
struct desc_struct {
union {
struct {
unsigned int a;
unsigned int b;
};
struct {
u16
limit0;
u16
base0;
unsigned base1: 8, type: 4, s: 1, dpl: 2, p: 1;
unsigned limit: 4, avl: 1, l: 1, d: 1, g: 1, base2: 8;
};
};} __attribute__((packed)); |