2014-04-09 69 views
0

我在尋找中斷服務程序的源代碼並搜索net_bhi();和netif_rx();在linux內核中的中斷例程。以上兩個API都是在Linux內核中接收udp的數據包。我想修改中斷程序 - 我應該計算中斷髮生時的時間戳。所以請有人幫助上述文件的位置在哪裏?如何在linux內核中找到中斷源代碼?

回答

0

我不確定路徑。但是你必須在/ usr/src/linux -...中找到它

但是如果你想用中斷打印一個時間戳,你可以使用信號處理程序捕獲中斷,然後使用gettimeofday() API來打印時間。

+0

我已經在/ usr/src/linux版本中,但是我不知道它到底在哪裏?我在內核中使用,如now = sched_clock();獲取時間戳。首先,我需要在內核源代碼中找到中斷服務例程。 – user3513765

+0

它不在可加載的內核模塊驅動程序中嗎? –

+0

你能否指定路徑? – user3513765

2

每個網絡設備(驅動程序,真的:知道如何操作設備的軟件)都會有自己的中斷服務程序。驅動程序用request_irq註冊該例程的地址(本質上,「當這個中斷觸發時,給我打電話」)。

在網絡驅動程序的情況下,驅動程序的中斷服務程序通常會做的比調用任務蕾或軟中斷其他小。這是爲了避免在可能阻塞其他關鍵中斷的狀態下長時間運行。

在大多數現代網絡驅動程序中,softirq實際上是通過名爲NAPI的框架觸發的。驅動程序將使用netif_napi_add註冊其NAPI輪詢例程,並在中斷時,驅動程序調用napi_schedule來通知其輪詢例程需要運行。

一旦它的任務蕾或NAPI調查程序被調用時,驅動程序將訪問設備寄存器來看看爲什麼設備中斷。如果有新的數據包可用,驅動程序通常會使用netif_rx或其變體將它們轉發到linux TCP/IP堆棧。

所以,你必須選擇在何處/如何記錄你的時間戳。在tasklet或NAPI輪詢例程中這樣做最容易,但在數據包實際到達後可能會有一些(可能很多)微秒。 (在沒有專門的硬件的情況下,數據包到達和時間戳記錄之間的某些延遲將是不可避免的)。

+0

很好的解釋@ gil-hamilton 雖然有一個問題,我怎樣才能找出在request_irq()中使用的irq號碼,這些號碼的來源在哪裏? 謝謝! – Michal

+0

對此沒有單一的答案。但是,您將看到的最常見情況是PCI設備;在那裏,irq號碼來自與設備相關聯的'struct pci_dev'。該中斷號由內核選擇並作爲初始總線枚舉的一部分分配給設備。在MSI或MSIX的情況下,驅動程序必須要求額外的中斷號作爲其初始化的一部分。 –