您的位置:首页 > 运维架构 > Linux

ldd3读书笔记:x86的中断处理顺序

2015-07-15 08:35 423 查看
就不说硬件相关的,从CPU调用中断向量处的代码开始:

1. 首先entry.S中的代码会把中断号push到堆栈上。

2. 调用到irq.c中的do_IRQ. 

给中断控制器发送一个ACK信号:对于有中断控制器有意义,对于某些中断控制器则没有意义。

do_IRQ然后会spinlock住相应的中断号:这样可以防止相同的中断在多个处理上同时执行。

调用handle_IRQ_event

检查SA_INTERRUPT标志,如果没有,则会开中断。

调用用户注册的中断处理函数。

中断向量检测就是基于这个流程来做的,如果do_IRQ发现中断上没有注册用户处理函数,并且IRQ_WAITING标志被置位,就会清除掉这个标志再返回。所以在probe_on实际上把所有当前没有使用的中断都置IRQ_WAITING,这样当中断产生后,实际上可能使用到的中断就会被清除。当probe_off的时候,就可以看到到底是哪个中断被触发了。

来个假设的例子,125中断当前没有被使用,probe_on会把125中断都标记为IRQ_WAITING。然后设备产生一个中断。假设实际使用的2号中断,do_IRQ被调用处理2号中断,发现根本没有注册handler。就清除掉2号中断上的IRQ_WAITING的标志。最后当probe_off被调用时,就返回2,表示产生过2号中断。

所以probe_off时,如果发现有多过一个中断产生或者没有中断产生,都是一种失败情况。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux kernel 读书