我正在阅读Linux Kernel开发,并在Tasklets章节(https://doc.lagout.org/operating%20system%20/linux/Linux%20Kernel%20Development%2C%203rd%20Edition.pdf第143页)中感到困惑。 在tasklet_schedule函数中,保存中断状态,而在taslet_action中则不保存。作者解释说,上下文未保存在taslet_action中,因为该函数知道始终启用中断。我不明白这组中断如何干扰保存上下文?谢谢!
答案 0 :(得分:0)
作者声明可以在禁用或启用中断的情况下调用tasklet_schedule。由于它希望禁用它们,因此需要保存是否已禁用它们。然后,在工作完成之后,它知道是否启用它们(如果在调用之前启用了它们,则启用它们,如果在调用之前禁用了它们,则将其禁用)。相反,仅在启用了中断的情况下调用tasklet_action,因此检查它们的状态毫无意义。他们总是被禁用并在返回时启用。
答案 1 :(得分:0)
对于tasklet_schedule:
我们不希望在计划Tasklet时中断打扰我们,因此我们必须禁用它。但是我们也知道,在完成任务小程序的调度后,我们希望返回到调用任务小程序之前的IRQ状态。为此,我们在执行任何操作之前先保存IRQ寄存器的状态,然后根据需要禁用IRQ,进行调度,现在再返回恢复IRQ的状态,然后从函数返回。
现在进入复杂的部分,为什么在执行Tasklet时(即处理程序调用Tasklet函数时)我们不需要保存IRQ? 要了解我们需要看两个不同的段落:
第141页:
softirq处理程序在启用中断的情况下运行,无法执行 睡眠。当处理程序运行时,当前处理器上的softirq 禁用,但是另一个处理器可以执行其他softirq。如果 执行时再次引发相同的softirq 处理器可以同时运行它。
因此,它声明始终启用了中断。
现在转到第143页:
- 禁用本地中断传递(无需先保存其状态,因为此处的代码始终被称为softirq 处理程序,并且始终启用中断)并检索 该处理器的tasklet_vec或tasklet_hi_vec列表
因此我们可以得出结论,我们不需要保存IRQ状态,因为我们已经知道它的状态,并且在所有条件下它都将保持不变,因此我们只需禁用IRQ并在以后启用它即可。