是否有可能在探測完成之前呼叫驅動程式的中斷處理程序?

是否有可能在探測完成之前呼叫驅動程式的中斷處理程序?

我正在檢查 Linux 核心中的驅動程式核心模組,通常從探測函數呼叫 request_irq() 。 drivers/net/ethernet/natsemi/ns83820.ko 就是這樣的一個例子。

request_irq() 呼叫 request_threaded_irq() ,這在註解中提到:

This call allocates interrupt resources and enables the
interrupt line and IRQ handling. From the point this
call is made your handler function may be invoked.

關聯:https://elixir.bootlin.com/linux/latest/source/kernel/irq/manage.c#L1984

這意味著甚至可以在探測完成之前呼叫處理程序。

但我注意到在許多驅動程式中,不關心可以在探針和中斷處理程序中同時讀取和修改的共享變數或開發欄位。

我想知道探針和中斷處理程序並行運行的情況多久發生一次。

答案1

當探測尚未完成時,可以呼叫中斷處理程序。然而,要實現這一點,設備需要初始化並產生中斷。通常,探測函數會先初始化裝置並確保在請求 irq 之前它不會產生中斷。這確保了在驅動程式準備好處理中斷之前不會呼叫處理程序。

一個常見的例外是 RTC 驅動程序,我最近修復了其中一些問題。發生這種情況是因為 RTC 仍在運行,而 linux 沒有運行,且驅動程式不得在每次啟動時重新初始化裝置。這是一個例子:

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=10d0c768cc6d581523d673b9d1b54213f8a5eb24

相關內容