谁引发这个软中断?是否在每次滴答时都会引发(基于计时器中断?)
这是否会使内核调度一个可运行的进程?如果是,那么低优先级软中断(HR_TIMER,RCU_SOFTIRQ)的处理程序如何运行,因为现在执行的是进程上下文(在调度()之后)?
答案1
根据内核文档:
软件中断上下文:软中断和 Tasklet
每当系统调用即将返回用户空间或硬件中断处理程序退出时,任何标记为待处理(通常由硬件中断)的“软件中断”都会运行(kernel/softirq.c)。大部分真正的中断处理工作都是在这里完成的。在过渡到 SMP 的早期,只有“下半部分”(BH),它没有利用多个 CPU。在我们从用火柴棍和鼻涕制成的发条计算机转向后不久,我们就放弃了这个限制并转向“软中断”。
include/linux/interrupt.h 列出了不同的软中断。一个非常重要的软中断是定时器软中断(include/linux/timer.h):你可以注册让它在给定的时间长度内为你调用函数。
处理软中断通常是一件痛苦的事情,因为同一个软中断会同时在多个 CPU 上运行。因此,tasklet (include/linux/interrupt.h) 更常用:它们是动态可注册的(意味着您可以拥有任意多个),并且它们还保证任何 tasklet 只能在一个 CPU 上运行尽管不同的 tasklet 可以同时运行,但任何时候都可以。
警告“tasklet”这个名字具有误导性:它们与“任务”无关,可能更多地与阿列克谢·库兹涅佐夫当时喝的一些劣质伏特加有关。
您可以使用 in_softirq() 宏 (include/linux/interrupt.h) 来判断您是否处于软中断(或微线程)中。
警告请注意,如果持有 bh 锁(见下文),这将返回误报。