Linux 内核--硬件中断初始化及中断描述符表

本文分析基于Linux 0.11内核,转载请标明出处http://blog.csdn.net/yming0221/archive/2011/06/01/6459119.aspx

以下是硬件初始化函数

其中set_trap_gate是宏定义

定义如下

中断描述符定义如下:

在实地址模式中,CPU把内存中从0开始的1K字节作为一个中断向量表。表中的每个表项占四个字节,由两个字节的段地址和两个字节的偏移量组成,这样构成的地址便是相应中断处理程序的入口地址。但是,在保护模式下,由四字节的表项构成的中断向量表显然满足不了要求。这是因为,除了两个字节的段描述符,偏移量必用四字节来表示;要有反映模式切换的信息。因此,在保护模式下,中断向量表中的表项由8个字节组成,如图3.2所示,中断向量表也改叫做中断描述符表IDTInterrupt Descriptor Table)。其中的每个表项叫做一个门描述符(gate descriptor),“门”的含义是当中断发生时必须先通过这些门,然后才能进入相应的处理程序。

Linux 内核--硬件中断初始化及中断描述符表

3.2门描述符的一般格式

其中类型占3位,表示门描述符的类型,主要门描述符是:

·中断门(Interrupt gate

其类型码为110,中断门包含了一个中断或异常处理程序所在段的选择符和段内偏移量。当控制权通过中断门进入中断处理程序时,处理器清IF标志,即关中断,以避免嵌套中断的发生。中断门中的DPLDescriptor Privilege Level)为0,因此,用户态的进程不能访问Intel的中断门。所有的中断处理程序都由中断门激活,并全部限制在内核态。

·陷阱门(Trap gate

其类型码为111,与中断门类似,其唯一的区别是,控制权通过陷阱门进入处理程序时维持IF标志位不变,也就是说,不关中断。

·系统门(System gate

这是Linux内核特别设置的,用来让用户态的进程访问Intel的陷阱门,因此,门描述符的DPL3。通过系统门来激活4Linux异常处理程序,它们的向量是345128,也就是说,在用户态下,可以使用int3intoboundint0x80条汇编指令。

最后,在保护模式下,中断描述符表在内存的位置不再限于从地址0开始的地方,而是可以放在内存的任何地方。为此,CPU中增设了一个中断描述符表寄存器IDTR,用来存放中断描述符表在内存的起始地址。中断描述符表寄存器IDTR是一个48位的寄存器,其低16位保存中断描述符表的大小,高32位保存IDT的基址,如图3.3所示。

| 32位基地址|界限(16位) 共48位

图3.3

其中的函数声明

它们是通过汇编实现的/kernel/asm.s或/kernel/system_call.s

就拿divide_error函数来说明

asm.s中的汇编代码:

堆栈使用情况如下图

Linux 内核--硬件中断初始化及中断描述符表

开始时,堆栈指针esp指向中断返回地址的一栏(esp0),eip是指令寄存器,它的内容就是下一条指令的地址。然后通过pushl,将C函数

入栈,此时栈顶指针指向esp1处,通过交换指令xchgl %eax,(%esp),将eax和esp地址的内容(C函数地址)交换。而栈的大小没有发生

改变。当有数据入栈,esp寄存器大小将相应的减小。

你可能感兴趣的:(linux)