据我所知,Windows 系统中有 255 个虚拟 IRQ(芯片组只允许 16 个物理 IRQ),它们通常都使用物理 IRQ 11。在 Linux 系统中,还有一个虚拟 IRQ 的概念。
所以,我很感兴趣这个映射是如何实现的?来自 Linux 内核或只是算法的源代码示例将不胜感激。
据我所知,Windows 系统中有 255 个虚拟 IRQ(芯片组只允许 16 个物理 IRQ),它们通常都使用物理 IRQ 11。在 Linux 系统中,还有一个虚拟 IRQ 的概念。
所以,我很感兴趣这个映射是如何实现的?来自 Linux 内核或只是算法的源代码示例将不胜感激。
中断处理的具体实现会因架构和平台而异。这个答案主要针对Linux,因为源代码可用。至少对于 Linux,有一个通用的 IRQ 处理层,驱动程序是针对该层编写的,以便驱动程序可以在体系结构之间兼容,而与底层中断体系结构无关。
现代平台可能有多个中断控制器,因此它的平台特定代码处理请求的 IRQ 号request_irq()
到特定中断控制器的映射。
以mach-pxa
PXAxxx 基础平台的 Linux 架构为例。平台irq.c文件包含两个struct irq_chip
引用,指示两个不同的中断控制器。当pxa_init_irq()
被调用时,它会为特定的中断控制器分配一个虚拟中断号。平台代码确保为每个可能的中断源分配唯一的中断号。
有很多细节过于详细,无法在此处发布,因此我建议获取 Linux 源代码的副本并深入研究。如果您正在寻找映射,请专门查看不同的arch
目录。
如果你make htmldocs
从顶层做一个,你会得到一个Documentation/DocBook/index.html
你可以细读的。有关更多详细信息,请查看该genericirq
部分。
此外,Linux Device Drivers, Corbet, Rubini, Kroah-Hartman一书是一个极好的信息来源。