小编bsi*_*ang的帖子

Linux 内核如何处理共享的 IRQ?

根据我目前所读到的内容,“当内核收到中断时,所有注册的处理程序都会被调用。”

我知道每个 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.

linux kernel pci interrupt irq

14
推荐指数
2
解决办法
2万
查看次数

Linux 内核如何决定为同步 USB 端点分配多少带宽?

据我所知,使用同步传输的 USB 端点有一个与其关联的“wMaxPacketSize”参数,内核使用该参数来保证端点的一定带宽。

如果我没记错的话,这个最大数据包大小可以在 0 到 1024 字节之间的任何地方(对于高速传输)。在 Linux 系统中,此参数如何转化为以 Mbps 为单位的高速 (EHCI) 控制器的带宽分配?

USB 带宽分配取决于哪些其他因素(如果有)?

谢谢!

linux kernel usb

6
推荐指数
1
解决办法
3517
查看次数

标签 统计

kernel ×2

linux ×2

interrupt ×1

irq ×1

pci ×1

usb ×1