【问题标题】:Return value of interrupt handlers in linux kernellinux内核中中断处理程序的返回值
【发布时间】:2017-10-08 14:44:04
【问题描述】:

中断处理程序异步发生,因此不能被其他函数调用。那么,为什么 linux 内核中的中断处理程序会返回一个值呢?输入参数是如何传递给它的?

【问题讨论】:

    标签: linux linux-kernel


    【解决方案1】:

    中断处理程序有一个返回值有几个原因。

    1. 中断向量可以在多个设备之间共享。通过返回 IRQ_NONE/IRQ_HANDLED,中断处理程序可以指示中断是/不是来自它特别感兴趣的设备。如果返回 IRQ_NONE,则应调用列表中的下一个处理程序。
    2. 即使 IRQ 未共享,中断处理程序也可以向中断子系统指示处理中断时出现问题,应将其禁用以防止系统因 irq 循环而挂起。

    【讨论】:

    • IRQ_WAKE_THREAD 也可用于在较新的 Linux 内核上进行延迟处理。即,它表示当前进程可能会被中断以执行中断的部分。
    • 从 irq 处理程序返回 IRQ_HANDLED 是否会导致知道中断,即清除 irq 行?
    【解决方案2】:

    中断处理程序不是中断向量。中断向量是触发中断时处理器跳转到的代码。这是一个粗略的简化,但它看起来是这样的:

      interrupt_vector {
        num = check_interrupt_number()
        f = get_interrupt_handler_func(num);
        d = get_interrupt_handler_data(num);
        /* call interrupt handler */
        ret = f(d);
      }
    

    所以handler和data一起注册,中断向量代码调用registererd handler,传递注册的数据,并检查返回值。 当然,这里我们只有一个级别的处理程序,但您可以有几个,例如一个处理所有 PCI Irq 的处理程序,依次检查特定 PCI irq 的注册处理程序,并最终调用它传递注册数据等。 .

    当然,实际代码往往要复杂得多。你可以试试这个lxr link 来浏览 linux 内核源代码

    【讨论】:

      【解决方案3】:

      中断向量代码与多个附加的中断处理程序(特定于操作系统)到一个中断 - 处理程序可以返回一个值(通常进入像 x86 上的 EAX 这样的寄存器),因此向量代码可以管理一系列处理程序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-09
        • 2019-11-11
        • 2018-02-25
        • 2014-05-09
        • 1970-01-01
        • 2012-05-13
        • 2013-10-24
        • 1970-01-01
        相关资源
        最近更新 更多