就不说硬件相关的,从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时,如果发现有多过一个中断产生或者没有中断产生,都是一种失败情况。