中断描述符表(InterruptDescriptorTable,IDT)
中断描述符表(Interrupt Descriptor Table,IDT)将每个异常或分别与它们的处理过程联系起来。与GDT和LDT表类似,IDT也是由8字节长描述符组成的⼀个数组。
#pragma pack(push, 1)
//IDT的内存空间是⼀个数组。每个元素都有如下的结构
typedef struct P2C_IDT_ENTRY_ {
P2C_U16        offset_low;
P2C_U16        selector;
P2C_U8        reserved;
P2C_U8        type:4;
P2C_U8        always0:1;
P2C_U8        dpl:2;
P2C_U8        present:1;
P2C_U16        offset_high;
}P2C_IDTENTRY, *PP2C_IDTENTRY;
#pragma pack(pop)
中断描述符表
可以包含描述符。为了构成IDT表中的⼀个索引值,处理器把异常或中断的向量号乘以8。因为最多只
有256个中断或异常向量,所以IDT⽆需包含多于256个描述符。IDT中可以含有少于256个描述符,因为
只有可能发⽣的异常或中断才需要描述符。不过IDT中所有空描述符项应该设置其存在位(标志)为0
//
//现在这个中断门没有⽤了,设置type = 0使之空闲
//
idt_addr[old_id].type = 0;
IDT表可以驻留在线性的任何地⽅,处理器使⽤IDTR来定位IDT表的位置。这个寄存器
中含有IDT表32位的基地址和16位的长度(限长)值。IDT表基地址应该对齐在8边
界上以提⾼处理器的访问效率。限长值是以为单位的IDT表的长度。
#pragma pack(push, 1)
//从sidt指令获得⼀个如下的结构,从这⾥可以得到IDT的开始地址
typedef struct P2C_IDTR_ {
P2C_U16        limit; // 范围
P2C_U32        base; //基地址
}P2C_IDTR, *PP2C_IDTR;
#pragma pack(pop)
中断描述符表IDT和寄存器IDTR
LIDT和SIDT指令分别⽤于加载和保存IDTR寄存器的内容。
LIDT指令⽤于把内存中的限长值和基地址操作数加载到IDTR寄存器中。该指令仅能由当前CPL是0的代码执⾏,通常被⽤于创建IDT时的操作
代码中。
SIDT指令⽤于把IDTR中的基地址和限长内容复制到内存中。该指令可在任何特权
级上执⾏。
VOID    *p2cGetIdt()
{
PAGED_CODE();
P2C_IDTR idtr;
//
//⼀句汇编读取到IDT的位置
//
_asm sidt idtr;
return (void *)idtr.base;
}
如果中断或异常向量引⽤的描述符超过了IDT的界限,处理器会产⽣⼀个⼀般保护性异常
在实地址模式中,CPU把内存中从0开始的1K作为⼀个。表中的每个表项占四个字节,由两个字节的和两个字节的组成,这样构成的地址便是相应程序的⼊⼝地址。但是,在保护模式下,由四的表项构成的显然满⾜不了要求。这是因为,除了两个字节的,必⽤四字节来表⽰;‚要有反映的信息
在保护模式下,中的表项由8个组成,中断向量表也改叫做中断描述符表IDT(InterruptDescriptor Table)。其中的每个表项叫做⼀个门描述符(gate descriptor),“门”的含义是当中断发⽣时必须先通过这些门,然后才能进⼊相应的处理程序。
#pragma pack(push, 1)
//IDT的内存空间是⼀个数组。每个元素都有如下的结构
typedef struct P2C_IDT_ENTRY_ {
P2C_U16        offset_low;
P2C_U16        selector;
P2C_U8        reserved;
P2C_U8        type:4;
P2C_U8        always0:1;
P2C_U8        dpl:2;
P2C_U8        present:1;
P2C_U16        offset_high;
}P2C_IDTENTRY, *PP2C_IDTENTRY;
#pragma pack(pop)
主要门描述符是:
· 中断门(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四条。汇编table指令什么意思
最后,在保护模式下,中断描述符表在内存的位置不再限于从地址0开始的地⽅,⽽是可以放在内存的任何地⽅。为此,CPU中增设了⼀个中断描述符表寄存器IDTR,⽤来存放中断描述符表在内存的起始地址。中断描述符表寄存器IDTR是⼀个48位的寄存器,其低16位保存中断描述符表的⼤⼩,⾼32位保存IDT的.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。