根据我目前所读到的内容,“当内核收到中断时,所有注册的处理程序都会被调用。”
我知道每个 IRQ 的注册处理程序可以通过查看/proc/interrupts
,我也知道注册的处理程序来自调用request_irq
了回调的驱动程序,大致形式如下:
irqreturn_t (*handler)(int, void *)
Run Code Online (Sandbox Code Playgroud)
根据我所知道的,每个与特定 IRQ 关联的中断处理程序回调都应该被调用,并且由处理程序来确定是否确实应该由它处理中断。如果处理程序不应该处理特定的中断,它必须返回内核宏IRQ_NONE
。
我无法理解的是,每个驱动程序如何确定它是否应该处理中断。我想如果他们应该期待中断,他们可以在内部跟踪。如果是这样,我不知道他们将如何处理同一 IRQ 后面的多个驱动程序期望中断的情况。
我试图了解这些细节的原因是因为我正在搞乱kexec
在系统操作中间重新执行内核的机制,同时在 PCIe 桥接器以及下游 PCI 上使用复位引脚和各种寄存器设备。在这样做的过程中,重新启动后,我要么遇到内核恐慌,要么其他驱动程序抱怨即使没有进行任何操作,他们也收到了中断。
处理程序如何决定中断应该由它处理是个谜。
编辑:如果相关,有问题的 CPU 架构是x86
.
据我所知,使用同步传输的 USB 端点有一个与其关联的“wMaxPacketSize”参数,内核使用该参数来保证端点的一定带宽。
如果我没记错的话,这个最大数据包大小可以在 0 到 1024 字节之间的任何地方(对于高速传输)。在 Linux 系统中,此参数如何转化为以 Mbps 为单位的高速 (EHCI) 控制器的带宽分配?
USB 带宽分配取决于哪些其他因素(如果有)?
谢谢!