中断处理—步骤

来源:互联网 发布:python的matplotlib 编辑:程序博客网 时间:2024/05/24 01:43

一.硬件处理

我们在每条指令完成的时候,控制单元就会检查是否发生了中断。若不发生:继续执行下一条指令;若发生:进行下面的硬件处理:

1.确定中断的向量i。

2.读IDT中的第i项得到向量i的中断描述符。

3.中断描述符结合GDT得到得到中断处理程序的段描述符。

4.进程的CPL与段描述符的DPL比较,若CPL优先级比DPL的优先级高,说明中断的优先级比进程优先级低,产生异常。进程的CPL与中断描述符的DPL比较,若CPL优先级

比DPL的优先级低,说明这个门不是用户进程可以访问的,也产生异常,正常则执行下面步骤。

5.检查CPL是否发生变化(这个其实就是是否是从用户态进入内核态),如果变化,则要切换栈。这个很容易弄清,因为,用户态和内核态用的栈是不一样的。

6.如果发生的是故障,故障要重新执行导致异常的那条指令。所以用那条指令的地址装载cs和eip来执行那条指令。

7.将eflags、cs、和eip的值圧栈。

8.如果异常产生硬件出错码,则也圧栈。

9.用刚才得到的段描述符中的基址和中段描述符中的偏移地址装载cs和eip。这个就可以开始执行相应的处理程序了。


然后进入了中断处理程序,针对中断和异常的处理流程是不同的,下面分开讲述


二.异常处理

1.保存寄存器的值

2.高级C函数处理异常

3.通过ret_from_exception()函数从异常处理程序退出


三.中断处理

1.在内核栈中保存IRQ和寄存器的值
2.给为IRQ服务的PIC发送一个应答,并允许PIC进一步发出中断
3.执行共享这个IRQ的所有设备的中断服务例程
4.调到ret_from_intr()的地址从中断处理程序退出


四.软中断处理

1.通常在硬件中断中将可延迟的处理函数加到专门的数据结构中

2.在合适的时机,调用这些函数


五.中断的退出

1.考虑返回到内核控制路径还是用户态

2.考虑允许抢占来进行调度

3.是否要处理挂起信号等

1 0