Operating system linux下半部分如何在中断上下文中执行?

Operating system linux下半部分如何在中断上下文中执行?,operating-system,linux-kernel,kernel,Operating System,Linux Kernel,Kernel,在理解上半部和下半部的概念时,我来了 我问了一个问题 以下是我的理解: 上半部分和下半部分在中断上下文中执行。唯一的 不同之处在于,下半部分在启用中断的情况下执行,而 上半部分在禁用相应irq的情况下执行(仍然可以 通过使用SA_中断flag)克服此问题 问题是: 在从上半部分处理程序返回之前,return\u from\u intr 打电话。现在调用调度程序并执行下半部分(如果有) 有任何悬而未决的问题。 既然调用了return\u from\u intr,那么下半部分如何在 中断上下文?。它

在理解上半部和下半部的概念时,我来了 我问了一个问题

以下是我的理解: 上半部分和下半部分在中断上下文中执行。唯一的 不同之处在于,下半部分在启用中断的情况下执行,而 上半部分在禁用相应irq的情况下执行(仍然可以 通过使用
SA_中断
flag)克服此问题

问题是: 在从上半部分处理程序返回之前,
return\u from\u intr
打电话。现在调用调度程序并执行下半部分(如果有) 有任何悬而未决的问题。 既然调用了
return\u from\u intr
,那么下半部分如何在 中断上下文?。它将处于内核模式,而不是中断模式 模式


如果我错了,请纠正我

下半部分不在中断上下文中执行,这是将中断处理分为两部分并将较慢的代码移出ISR的整个过程。不过,它们仍然在内核上下文中。例如,请参阅。

中断处理的不同部分tasklet和softirq运行在软件中断之上。因此,它们被称为在中断上下文上运行(令人困惑的是,我将其称为下半上下文),在中断上下文中,所有CPU上都启用了所有硬件IRQ(仍然控制在我们手中)。在使用spin_lock_bh()处理软件中断时,如果需要,也可以禁用软件中断。

工作队列,另一种不同中断处理的方式,在内核进程上下文中运行。因此,他们可能会阻塞、睡眠或呼叫时间表。

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

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

您可能需要参考解释所有这些机制的。这里的“中断上下文”指的是软件中断/softirq上下文,其中in_Interrupt()返回true,而in_irq()将返回false。也就是说,此核心上的其他软件IRQ被禁用,但硬件IRQ被启用

是的,如果使用工作队列之类的东西来实现下半部分,它甚至是一个进程上下文而不是中断上下文。如果使用了tasklet,如果我没有弄错的话,它就是softirq上下文。有些人也可能称之为中断上下文。但是,当然,这不是hardirq上下文,我同意这是这里的重点。错误:工作队列是(唯一)在流程上下文中运行的下半部分机制。