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

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()中,要对时钟进行初始化,但是空的,因为要等到对进程调度初始化完毕后,再能让时钟跳动;因为一旦时钟开始跳动,那么进程调度也就随之开始了;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值