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

系统 2470 0

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

以下是硬件初始化函数

其中set_trap_gate是宏定义

定义如下

中断描述符定义如下:

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

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

3.2 门描述符的一般格式

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

· 中断门( 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 条汇编指令。

最后,在保护模式下,中断描述符表在内存的位置不再限于从地址 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 内核--硬件中断初始化及中断描述符表


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论