如何在Windows和Linux系统中实现物理到虚拟IRQ映射?

Ole*_*rov 3 c linux windows kernel linux-kernel

据我所知,Windows系统中有255个虚拟IRQ(芯片组只允许16个物理),它们通常都使用物理IRQ 11.在Linux系统中,还有一个虚拟IRQ的概念.

所以,我很感兴趣如何实现这种映射?来自Linux内核或只是算法的Sourse代码示例将不胜感激.

Aus*_*ips 5

中断处理的确切实现因架构和平台而异.这个答案主要针对Linux提供源代码.至少对于Linux来说,有一个通用的IRQ处理层,驱动程序可以根据这个层进行编写,这样驱动程序就可以在架构之间兼容,而与底层中断架构无关.

现代平台可能有多个中断控制器,因此它的平台特定代码处理请求的IRQ号request_irq()到特定中断控制器的映射.

mach-pxaLinux为PXAxxx基础平台的架构为例.平台irq.c文件包含两个struct irq_chip引用,表示两个不同的中断控制器.当pxa_init_irq()被调用时,它分配一个虚拟中断数到特定的中断控制器.平台代码确保为每个可能的中断源分配唯一的中断号.

有很多细节太详细,不能在这里发布,因此我建议获取Linux源代码的副本并深入研究.如果您正在寻找映射,请特别查看不同的arch目录.

如果你make htmldocs从顶层做一个,你会得到一个Documentation/DocBook/index.html你可以仔细阅读的.请查看该genericirq部分以获取更多详细信息.

此外,Linux设备驱动程序,Corbet,Rubini,Kroah-Hartman书籍是一个很好的信息来源.