【发布时间】:2014-04-09 08:55:24
【问题描述】:
我正在寻找中断服务程序的源代码并搜索net_bhi();和 netif_rx(); linux内核中的中断例程。以上两个api都是linux内核中udp的收包。我想修改中断例程 - 我应该计算中断发生时的时间戳。所以请有人帮忙上面的文件的位置在哪里??
【问题讨论】:
标签: c linux linux-kernel timestamp interrupt
我正在寻找中断服务程序的源代码并搜索net_bhi();和 netif_rx(); linux内核中的中断例程。以上两个api都是linux内核中udp的收包。我想修改中断例程 - 我应该计算中断发生时的时间戳。所以请有人帮忙上面的文件的位置在哪里??
【问题讨论】:
标签: c linux linux-kernel timestamp interrupt
每个网络设备(驱动程序,实际上:知道如何操作设备的软件)都会有自己的中断服务程序。驱动程序使用 request_irq 注册该例程的地址(本质上,“当此中断触发时,请在此处呼叫我”)。
在网络驱动程序的情况下,驱动程序的中断例程通常只会调用一个 tasklet 或 softirq。这是为了避免在可能阻塞其他关键中断的状态下长时间运行。
在大多数现代网络驱动程序中,软中断实际上是通过称为 NAPI 的框架触发的。驱动程序将使用 netif_napi_add 注册其 NAPI 轮询例程,并且在中断时,驱动程序调用 napi_schedule 以告知其轮询例程需要运行。
一旦调用了它的 tasklet 或 NAPI 轮询例程,驱动程序将访问设备寄存器以查看设备中断的原因。如果有新的数据包可用,驱动程序通常会将它们转发到带有 netif_rx 或其变体的 linux TCP/IP 堆栈。
因此,您必须选择记录时间戳的位置/方式。在 tasklet 或 NAPI 轮询例程中这样做是最简单的,但这可能是数据包实际到达后的一些(可能很多)微秒。 (在任何情况下,如果没有专门的硬件,数据包到达和时间戳记录之间的一些延迟将是不可避免的。)
【讨论】:
struct pci_dev。该中断号由内核选择并作为初始总线枚举的一部分分配给设备。在 MSI 或 MSIX 的情况下,驱动程序必须请求额外的中断号作为其初始化的一部分。
我不确定路径。但是你必须在/usr/src/linux-...中找到它。
但是如果你想打印一个带有中断的时间戳,你实际上可以使用信号处理程序捕获中断,然后使用 gettimeofday() API 来打印时间。
【讨论】: