linux-kernel - x86 如何为 Linux 中的 PCI 设备分配中断号?
问题描述
我的理解是 BIOS 或 EFI 在启动期间检测硬件并确定中断号,然后在内核启动并运行后将其传递给 Linux。根据我的研究,中断号越低,其优先级越高。
我的问题是 BIOS/EFI 如何决定哪个硬件应该比另一个具有更高的优先级?它是可配置的还是由 BIOS/EFI 硬编码的?
解决方案
有点儿。
使用传统 8259A PIC 芯片时,其中一种优先级模式基于 IRQ 编号 - 较低的 IRQ 具有更高的优先级。
然而,使用 IO APIC 和 MSI(X) 技术,IRQ 优先级在 LAPIC 中处理,并且可由操作系统配置。
对于旧方案,这些设备具有固定的 IRQ(不可配置)。
分配了优先级,以便重要/频繁的任务可以中断不太重要/频繁的任务。
如今,这些设备已被模拟,如果需要,可以重新分配它们的 IRQ(在相同情况下,这取决于芯片组/superio/嵌入式控制器),但这可能会导致一些兼容性问题。
因此,每台模拟传统设备(例如 HDD)的设备通常都分配有其传统 IRQ 编号。
另一个主题是非传统设备(例如 NIC)的 PCI 中断(PCIe 不赞成使用 INTx# 线以支持 MSI)。
这些是(是)真正的可编程 IRQ,每个 PCI-to-PCI 桥将其四个 PIRQA-PIRQD 输入引脚重新映射到其四个 INTA#-INTD# 输出引脚(它们以错综复杂的方式连接到桥的父 PIRQA-PIRQD 引脚时尚)。
Host-to-PCI-bridge INTA#-INTD#(概念上)连接到 8259A 和 IO-APIC。
映射可通过某些芯片组寄存器进行配置(例如,参见英特尔 200 系列 PCH 数据表第 2 卷的第 29 章)。
因此,固件至少可以自由地重新映射非传统设备的 PCI 中断。我认为使用的算法只是将较低的空闲 IRQ 分配给最“重要”的设备。
然而,如上所述,一旦操作系统从 8259A 模式切换,这些优先级就不再重要了。
推荐阅读
- git - 将开发分支合并到主分支的最佳实践是什么
- pixi.js - localhost 发送了无效响应
- spring-boot - spring-boot:确保提交的值是给定的一组有效选择之一
- python - 将文件存储为整数矩阵的有效方法
- java - 去掉包含 URL 的句子
- qt - QTextEdit 在 setText()/insertPlainText() 之后刷新
- discord.js - 如何检查抽搐频道是否存在?
- php - measuring time to receive POST data in a PHP/Apache script
- django-rest-framework - Django-notifications 序列化目标休息框架
- vb.net - How to Write to Active Directory using VB.NET or SQL or API?