Linux kernel 当针对中断处理程序调用下半部分时

Linux kernel 当针对中断处理程序调用下半部分时,linux-kernel,linux-device-driver,interrupt-handling,Linux Kernel,Linux Device Driver,Interrupt Handling,当提到Linux内核中断处理程序时,我知道有两个中断执行阶段,第一个是上半部分,第二个是下半部分 我知道上半部分将在硬件中断发生时立即执行,但我的疑问是下半部分何时以及如何执行?下半部分实现为tasklet(延迟中断上下文)、workqueue(进程上下文)和softirq(很少,只有Linux内核中的9个) 计时器中断处理程序检查9个软件IRQ中要执行的软件(调度器、HRTimer、网络rx/tx、微线程等)。如果有任何挂起的softirq(比如上半部分通知的Tasklet列表),那么这些将被

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


我知道上半部分将在硬件中断发生时立即执行,但我的疑问是下半部分何时以及如何执行?

下半部分实现为tasklet(延迟中断上下文)、workqueue(进程上下文)和softirq(很少,只有Linux内核中的9个)

计时器中断处理程序检查9个软件IRQ中要执行的软件(调度器、HRTimer、网络rx/tx、微线程等)。如果有任何挂起的softirq(比如上半部分通知的Tasklet列表),那么这些将被执行。对于任何tasklet,对于任何其他softirq也是如此。另外,由于tasklet是一种softirq,它只能在同一个CPU核上执行

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

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

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


如何执行:如果您的下半部分是由一个tasklet实现的,那么它的执行是通过使用
task\u schedule()
函数来调度的,该函数通常从中断处理程序内部调用。此函数不执行tasklet,但通知调度程序将tasklet函数排队以供以后执行。

下半部分是作为tasklet还是作为workqueue实现的?它是作为tasklet实现的。