如何在linux内核中找到中断源代码?

时间:2014-04-09 08:55:25

标签: c linux linux-kernel timestamp interrupt

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

2 个答案:

答案 0 :(得分:2)

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

对于网络驱动程序,除了调用tasklet或softirq之外,驱动程序的中断例程通常会做很少的事情。这是为了避免在可能阻止其他关键中断的状态下长时间运行。

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

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

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

答案 1 :(得分:0)

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

中找到它

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