首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

linux下X86架构IDT解析

linux下X86架构IDT解析

一、中断描述符表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));
继承事业,薪火相传
返回列表