您的位置:首页 > 其它

【中断异常】中断向量表IDT的初始化

2014-05-08 22:49 357 查看
Linux内核在初始化阶段完成了对页式虚存管理的初始化以后,便调用trap_int()和init_IRQ()两个函数对中断机制的初始化;

(1)trap_init()主要是对一些系统保留的中断向量的初始化(包括保留专用的IDT表项以及系统调用所用的陷阱门),而init_IRQ()主要是针对外设中断向量的初始化(设置外设的通用中断门);

(2)在trap_init()中,程序首先设置中断向量开头的19个陷阱门,用于异常处理的,其中中断向量14就是页面异常保留而用的,发生页面映射及访问过程中的发生问题,就会以14为中断向量的异常;然后就是系统调用向量的初始化;其实set_trap_gate()和set_intr_gate()是设置中断门,当中断是由外部中断产生的或CPU异常引起的,总能进入该门,而软件产生的“INT
n”总会被拒之门外,因为用户空间的CPL为3,而中断门的CPL为0,,故应该set_trap_gate()使用“INT n”来降低门的DPL,即陷阱门;用set_system_gate()也是设置陷阱门的,因为系统调用也是可中断的,set_call_gate()是linux为了保持与其他UNIX族系统调用使用了改门而设置使用的,本身它并不使用的,上述最终都是调用_set_gate()(使用汇编写的,来设置IDT表项的);

(3)在init_IRQ()中,首先对PC的中断控制器8259A进行初始化,并且初始化一个结构数组irq_desc[];irq_desc[]是因为不足256个向量是不够用的,因此涉及到某些向量的共享,因此在linux限制每一个中断源都必须独占一个中断向量是不现实的;因此linux为每一个中断向量设置一个队列,而根据每一个中断源所产生的中断向量,将其中断服务程序挂到相应的队列中去;首先执行与中断向量对应的一段总服务程序,根据具体的中断向量所对应的一段总服务程序,根据具体中断源的设备号在其所属队列中找到特定的服务程序,因此需要这样一个结构数组;

(4)在init_IRQ()中,紧接着设置NR_IRQS个中断向量的IDT表项,跳过已设置的系统调用向量0x80;函数指针interrupt[]中有16个指针调转函数,其实它们只是中断向量相关的数值不一样,都调用共同的函数;

(5)在init_IRQ()中,要对时钟进行初始化,但是空的,因为要等到对进程调度初始化完毕后,再能让时钟跳动;因为一旦时钟开始跳动,那么进程调度也就随之开始了;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: