1

在了解上半部分和下半部分的概念时,我遇到了一个问题。

这是我的理解:上半部分和下半部分在中断上下文中执行。唯一的区别是下半部分在启用中断的情况下执行,而上半部分在相应的 irq 禁用的情况下执行(仍然可以通过使用SA_INTERRUPT标志来克服)。

问题:就在从上半部分处理程序返回之前,return_from_intr被调用。现在调度程序被调用并执行下半部分,如果有任何未决的。既然return_from_intr被调用了,下半部分如何在中断上下文中执行?它将处于内核模式而不是中断模式?

如果我错了,请纠正我。

4

4 回答 4

2

下半部分不在中断上下文中执行,这是将中断处理分成两半并将较慢的代码移到 ISR 之外的全部要点。不过,它们仍在内核上下文中。例如,请参阅这篇文章

于 2012-09-04T09:38:44.353 回答
0

小任务和软中断是中断处理的不同部分,运行在软件中断之上。因此,据说它们在中断上下文中运行(令人困惑的是,我将其称为下半部分上下文),其中所有的硬中断都在所有 CPU 上启用(仍然控制在我们手中)。如果需要,也可以在使用 spin_lock_bh() 处理软件中断时禁用软件中断。
工作队列,另一种不同的中断处理方式,在内核进程上下文中运行。因此,它们可能会阻塞、休眠或调用调度。

于 2014-03-17T15:29:14.670 回答
0

您的问题中有一些假设是错误的:

  • 上半部分处理程序在中断上下文中运行
  • 存在 3 种不同的下半部分机制:
    • Softirqs,在中断上下文中运行
    • Tasklet构建在 softirq 之上,因此在中断上下文中运行
    • 工作队列,这是在进程上下文中运行的唯一下半部分机制

您可能想参考Robert Love 的优秀著作,它解释了所有这些机制。

于 2016-02-12T11:56:35.650 回答
0

这里的“中断上下文”是指软件中断/软中断上下文,其中 in_interrupt() 返回 true,而 in_irq() 将返回 false。也就是说,这个核心上的其他软中断被禁用,但硬件中断被启用。

于 2020-04-26T21:54:05.670 回答