【问题标题】:Can an interrupt handler be preempted?可以抢占中断处理程序吗?
【发布时间】:2011-05-09 08:27:11
【问题描述】:

我知道 linux 有嵌套中断,其中一个中断可以“抢占”另一个中断,但是对于其他任务呢。

我只是想了解 linux 如何处理中断。它们可以被其他用户任务/内核任务抢占吗?

【问题讨论】:

    标签: linux linux-kernel kernel interrupt


    【解决方案1】:

    阅读 Why kernel code/thread executing in interrupt context cannot sleep? 链接到 Robert Loves article,我读到了这个:

    一些中断处理程序(已知 Linux 作为快速中断处理程序)运行 与本地的所有中断 处理器禁用。这是为了 确保中断处理程序运行 不间断,尽快 可能的。更何况,所有的中断 处理程序以其当前运行 中断线全部禁用 处理器。这确保了两个 相同的中断处理程序 中断线不运行 同时。它还可以防止设备 司机作家不必处理 递归中断,这很复杂 编程。

    所以 AFIK 所有的 IRQ 在中断处理程序中都被禁用,因此它不能被中断!?

    【讨论】:

    • 默认情况下所有的 irq 都没有被禁用,只有相同的 irq 在所有处理器上被禁用。但是使用 request_irq 中的标志,您可以在处理中断时禁用本地处理器上的所有其他中断。
    【解决方案2】:

    简单回答:一个中断只能被更高优先级的中断打断。

    因此,中断可以被内核或用户任务中断如果中断的优先级低于内核调度程序中断优先级或用户任务中断优先级。

    请注意,“用户任务”是指用户定义的中断

    【讨论】:

    • 这很晚,但在 vanila linux 内核中没有中断优先级的概念。
    猜你喜欢
    • 2017-03-12
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 2020-09-16
    相关资源
    最近更新 更多