【问题标题】:How can the linux bottom halfs execute in interrupt context?linux下半部分如何在中断上下文中执行?
【发布时间】:2012-08-28 19:25:06
【问题描述】:

在理解上半部和下半部的概念的同时,我来了 对面有个问题。

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

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

如果我错了,请纠正我。

【问题讨论】:

    标签: operating-system linux-kernel kernel


    【解决方案1】:

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

    【讨论】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      您可能想参考解释所有这些机制的excellent book by Robert Love

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2013-11-13
          • 1970-01-01
          • 1970-01-01
          • 2019-03-19
          • 2017-12-19
          • 2014-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多