中断处理程序在完成一些堆栈和寄存器的处理后,调用do_IRQ函数。do_IRQ是中断在C语言的总入口。
common_interrupt:
addl $-0x80,(%esp) /* Adjust vector into the [-256,-1] range */
SAVE_ALL
TRACE_IRQS_OFF
movl %esp,%eax
call do_IRQ
jmp ret_from_intr
ENDPROC(common_interrupt)
CFI_ENDPROC
do_IRQ{)函数执行与一个中断相关的所有中断服务例程. 其原型如下:
unsigned int __irq_entry do_IRQ(struct pt_regs *regs)
{
struct pt_regs *old_regs = set_irq_regs(regs);
/* high bit used in ret_from_ code */
unsigned vector = ~regs->orig_ax;
unsigned irq;
exit_idle();
irq_enter(); //执行__irq_enter( )宏,它使表示中断处理程序嵌套数量的计数器递增.
irq = __get_cpu_var(vector_irq)[vector];//取得中断号
if (!handle_irq(irq, regs)) { //重要
ack_APIC_irq();
if (printk_ratelimit())
pr_emerg("%s: %d.%d No irq handler for vector (irq %d)\n",
__func__, smp_processor_id(), vector, irq);
}
irq_exit(); //重要
set_irq_regs(old_regs);
return 1;
}