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