大多数操作系统把中断分成两部分:top half、bottom half。之所以这样是因为执行中断服务函数时最好的情况都会屏蔽同级的中断,如果中断服务函数执行时间很长的话,就会导致系统响应不够及时,所以需要中断服务函数里面的处理很快。
Bottom half
内核里面下半部有三种实现方式,分别是sofrirq、tasklet、workqueue。其中softirq和tasklet还是在中断上下文中执行。在irq_exit中会判断是否有软中断的标志,然后执行。
/**
* generic_handle_arch_irq - root irq handler for architectures which do no
* entry accounting themselves
* @regs: Register file coming from the low-level handling code
*/
asmlinkage void noinstr generic_handle_arch_irq(struct pt_regs *regs)
{
struct pt_regs *old_regs;
// 进入中断上下文,禁用抢占和调度
irq_enter();
old_regs = set_irq_regs(regs);
handle_arch_irq(regs);
set_irq_regs(old_regs);