Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel 处理微线程时何时保存状态?_Linux Kernel_Interrupt Handling_Tasklet - Fatal编程技术网

Linux kernel 处理微线程时何时保存状态?

Linux kernel 处理微线程时何时保存状态?,linux-kernel,interrupt-handling,tasklet,Linux Kernel,Interrupt Handling,Tasklet,我正在阅读Linux内核开发,在tasklets一章(第143页)中感到困惑。 在tasklet_调度功能中,中断状态保存,而在taslet_操作中则不保存。作者解释说,由于函数知道总是启用中断,因此上下文不会保存在taslet_操作中。我无法理解中断集是如何影响保存上下文的?谢谢大家! 作者声明,可以在禁用或启用中断的情况下调用tasklet_调度。由于它希望禁用它们,因此需要保存它们是否已禁用。然后在工作完成后,它知道是否启用它们(如果在调用之前启用了它们,则启用它们;如果在调用之前禁用了它

我正在阅读Linux内核开发,在tasklets一章(第143页)中感到困惑。
在tasklet_调度功能中,中断状态保存,而在taslet_操作中则不保存。作者解释说,由于函数知道总是启用中断,因此上下文不会保存在taslet_操作中。我无法理解中断集是如何影响保存上下文的?谢谢大家!

作者声明,可以在禁用或启用中断的情况下调用tasklet_调度。由于它希望禁用它们,因此需要保存它们是否已禁用。然后在工作完成后,它知道是否启用它们(如果在调用之前启用了它们,则启用它们;如果在调用之前禁用了它们,则保持禁用状态)。相反,tasklet_操作仅在启用中断的情况下调用,因此没有必要检查它们的状态。它们总是在返回时被禁用和启用。

对于tasklet\u计划:

当我们计划一个tasklet时,我们不希望中断打扰我们,所以我们必须禁用它。但我们也知道,当我们完成了对tasklet的调度后,我们希望回到调用schedule tasklet之前的IRQ状态。为了实现这一点,我们在做任何事情之前保存IRQ寄存器的状态,然后根据我们的要求禁用IRQ,执行调度,现在在返回之前恢复IRQ的状态,然后从函数返回

现在让我们来看看复杂的部分,为什么我们不需要在执行tasklet时保存IRQ,即当处理程序调用tasklet函数时? 要理解这一点,我们需要看两个不同的段落:

第141页:

softirq处理程序在启用中断的情况下运行,并且无法 sleep。当处理程序运行时,当前处理器上的softirq将被删除 已禁用。但是,另一个处理器可以执行其他软件。如果 在执行时再次引发相同的softirq,另一个 处理器可以同时运行它

因此,这声明中断总是启用的

现在转到第143页:

  • 禁用本地中断传递(无需首先保存它们的状态,因为这里的代码始终被称为softirq 处理程序和中断始终处于启用状态)并检索 此处理器的tasklet\u vec或tasklet\u hi\u vec列表
  • 所以我们可以得出结论,我们不需要保存IRQ状态,因为我们已经知道它的状态,并且在所有条件下它都会保持不变,所以我们只是禁用IRQ,然后启用它