【问题标题】:how to find the interrupt source code in linux kernel?如何在linux内核中找到中断源代码?
【发布时间】:2014-04-09 08:55:24
【问题描述】:

我正在寻找中断服务程序的源代码并搜索net_bhi();和 netif_rx(); linux内核中的中断例程。以上两个api都是linux内核中udp的收包。我想修改中断例程 - 我应该计算中断发生时的时间戳。所以请有人帮忙上面的文件的位置在哪里??

【问题讨论】:

    标签: c linux linux-kernel timestamp interrupt


    【解决方案1】:

    每个网络设备(驱动程序,实际上:知道如何操作设备的软件)都会有自己的中断服务程序。驱动程序使用 request_irq 注册该例程的地址(本质上,“当此中断触发时,请在此处呼叫我”)。

    在网络驱动程序的情况下,驱动程序的中断例程通常只会调用一个 tasklet 或 softirq。这是为了避免在可能阻塞其他关键中断的状态下长时间运行。

    在大多数现代网络驱动程序中,软中断实际上是通过称为 NAPI 的框架触发的。驱动程序将使用 netif_napi_add 注册其 NAPI 轮询例程,并且在中断时,驱动程序调用 napi_schedule 以告知其轮询例程需要运行。

    一旦调用了它的 tasklet 或 NAPI 轮询例程,驱动程序将访问设备寄存器以查看设备中断的原因。如果有新的数据包可用,驱动程序通常会将它们转发到带有 netif_rx 或其变体的 linux TCP/IP 堆栈。

    因此,您必须选择记录时间戳的位置/方式。在 tasklet 或 NAPI 轮询例程中这样做是最简单的,但这可能是数据包实际到达后的一些(可能很多)微秒。 (在任何情况下,如果没有专门的硬件,数据包到达和时间戳记录之间的一些延迟将是不可避免的。)

    【讨论】:

    • 很好的解释@gil-hamilton 不过有一个问题,我怎样才能找出request_irq() 中使用的irq 编号,这些编号的来源在哪里?谢谢!
    • 对此没有单一的答案。但是,您将看到的最常见的情况是 PCI 设备。在那里,中断号来自与设备关联的struct pci_dev。该中断号由内核选择并作为初始总线枚举的一部分分配给设备。在 MSI 或 MSIX 的情况下,驱动程序必须请求额外的中断号作为其初始化的一部分。
    【解决方案2】:

    我不确定路径。但是你必须在/usr/src/linux-...中找到它。

    但是如果你想打印一个带有中断的时间戳,你实际上可以使用信号处理程序捕获中断,然后使用 gettimeofday() API 来打印时间。

    【讨论】:

    • 我已经在 /usr/src/linux 版本中但我不知道它到底在哪里??我在内核中使用 now = sched_clock();获取时间戳。首先我需要在内核源码中找到中断服务程序。
    • 它不在可加载的内核模块驱动程序中吗?
    • 你能指定路径吗??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 2012-08-22
    相关资源
    最近更新 更多