分类: LINUX
2014-02-20 15:25:30
=============================================================
中断和异常处理流程
=============================================================
-------------------------------------------------------------
1 中断和异常区别
-------------------------------------------------------------
1) 中断:异步,外设硬件产生
a、中断向量从32开始=irq+32,由驱动动态申请
b、使用中断门,cpu硬件自动关中断,清IF标记,并通过PENDING标记将本来可能发生在同一通道上的中断嵌套化解为一个循环。
2) 异常:同步,编程或硬件异常产生
a、中断向量0-19,2是nmi(例外),内核中固化
b、使用陷进门,不清IF,不关中断
c、分fault、trap和abort
fault:可纠正错误,eip指向出错的指令,即异常返回后重新执行异常指令
trap:eip指向出错的下一条指令
abort:异常终止,严重错误,eip不能保存异常指令位置,程序无法继续正常,通常是直接结束
Linux中仅使用中断门和陷阱门,而没有使用任务门
-------------------------------------------------------------
2 中断初始化
-------------------------------------------------------------
a、实模式:将中断向量表中的每一项都初始化为默认的中断服务例程ignore_int
b、保护模式,基本流程如下:
start_kernel
trap_init()
陷阱门直接将IDT表项初始化为异常处理handler
init_IRQ()
中断门初始化统一的入口:common_interrupt
-------------------------------------------------------------
3 设备驱动程序调用request_irq注册中断
-------------------------------------------------------------
setup_irq()
在全局中断描述符结构数组(irq_destc[])中,如果该中断号被使用,并且新旧中断都设置了共享,就把新中断加载就中断的后面;如果中
断号没有被使用,就直接加在中断描述符结构数组中,并设置中断使能。
-------------------------------------------------------------
4 中断处理
-------------------------------------------------------------
基本原理:设备产生中断,通过总线把电信号发给中断控制器。如果中断是激活的,那么中断控制器就会把中断发往处理器。在大多数体系结构中,这个工作就是给处理器的特定管脚发送一个信号。除非在处理器上禁止该中断,否则,处理器会立即停止它正在做的事情,关闭中断系统,然后跳到内存中预定义的地址(即IDT表中的内容)开始执行哪里的代码,。是中断处理程序的入口处。
代码流程:
do_IRQ
__do_IRQ
handle_IRQ_event
循环调ret = action->handler(irq, action->dev_id, regs);
基本原理:对于0~31号中断向量,保留后用来处理异常事件。操作系统提供相应的异常处理程序,并在初始化时把处理程序的入口地址设置
在对应的IDT表中。当产生一个异常时,处理器就会自动把控制转移到相应的处理程序的入口。运行相应的处理程序,进行相应的处理后,返回原中断处。
-------------------------------------------------------------
6中断、异常返回
-------------------------------------------------------------