当关于中断处理程序调用下半部分时

时间:2013-12-07 12:32:39

标签: linux-kernel linux-device-driver interrupt-handling

当提到Linux内核中断处理程序时,我知道有两个阶段的中断执行,第一个是上半部分和第二个下半部分。

我知道在HW发生中断时会立即执行上半部分,但我怀疑下半部分何时以及如何执行?

2 个答案:

答案 0 :(得分:4)

  

¿下半部分何时以及如何执行?

当:它在中断处理程序之后执行,实际上,它的执行是由中断处理程序本身触发的。有时它会在中断处理程序之后执行,有时不执行。

如何:如果您的下半部分由tasklet实现,则使用task_schedule()函数调度其执行,通常在中断处理程序内部调用。此函数不执行tasklet,但会通知调度程序对tasklet函数进行排队以便以后执行。

答案 1 :(得分:3)

下半部分实现为tasklets(延迟中断上下文),工作队列(进程上下文)和softirqs(很少,Linux内核中只有9个)。

定时器中断处理程序检查要执行的9个softirq中的哪个(调度程序,hrtimers,网络rx / tx,tasklet等)。如果有任何挂起的softirq,(比如上半部分已通知的tasklet列表)那么就会执行。至于任何tasklet,对任何其他softirq也是如此。此外,因为tasklet是一种softirq,它只能在同一个CPU核心上执行。

相反,当相应的进程随后上下文切换时,将执行工作队列。因此,与tasklet不同,这些可以休眠,也可以在其他CPU核心上进行调度。