我正在检查 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 则未运行,并且驱动程序不得在每次启动时重新初始化设备。这是一个例子: