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

标签 c linux windows linux-kernel kernel

据我所知,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/

相关文章:

linux - 使用 crontab 从数据库中删除旧记录

php - 使用PHP shell_exec()执行BASH脚本,无法写入文件

c++ - 在windows中获取当前线程的NUMA Node

c - 转换到 __m128i 期间出现奇怪错误

linux - 如何在字符串中捕获返回码并重新运行

c# - 使用 Web 代理的 HttpWebRequest 工作,然后在一段时间后失败

c++ - libcurl 中的波兰变音符号 (c++)

c - 在 c 文件之间共享变量

c - 柏林噪声方 block 不匹配

c - getrusage 是如何工作的以及 usage 结构内部到底是什么?