当提到Linux内核中断处理程序时,我知道有两个阶段的中断执行,第一个是上半部分和第二个下半部分。
我知道在HW发生中断时会立即执行上半部分,但我怀疑下半部分何时以及如何执行?
答案 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核心上进行调度。