7

我正在为 Linux 中的 PCIe 卡编写设备驱动程序。我正在尝试在我的驱动程序中使用中断。

读取 PCI 配置寄存器(偏移量 0x3C)的“IRQ Line”部分会报告为设备分配的 IRQ 线是11lspci -b -vv还报告说我的设备的中断号是11

这是它变得奇怪cat /sys/bus/pci/devices/<my_device>/irq的地方......报告中断号是19lspci -vv还报告中断号是19。

在我的驱动程序中请求11不起作用。如果我在驱动程序中请求19,我可以很好地捕获中断。

是什么赋予了?

谢谢!!!

4

2 回答 2

6

我相信这与“物理”和“虚拟”IRQ 线路之间的差异有关。由于处理器的物理 IRQ 线路数量有限,它分配虚拟 IRQ 线路以允许 PCI 设备的总数超过物理线路的数量。

在这种情况下,19 是您的虚拟 IRQ 线路(由处理器识别),而 11 是物理线路(由 PCI 设备识别)。

顺便说一句,您可能真的应该从该设备的 struct pci_dev 中获取 IRQ 编号,因为它们是动态生成的。

于 2013-03-19T23:58:33.187 回答
1

肖恩的回答很容易理解。不过在这里我会尽量让它更完整。

CPU 的 IRQ 引脚几乎总是不直接连接到外围设备,而是通过可编程中断控制器(PIC,例如 Intel 8259A)。这有助于处理大型设备扇出和异构中断格式(基于引脚与基于消息的 PCIe)。

如果您运行最新版本的 lspci,它将打印如下信息

Interrupt: pin A routed to IRQ 26

这里,pin A作为 OP 中的 11,是物理引脚。这是由 PCI 设备保存并由硬件用于在中断控制器之间进行交换的东西。自民党:

PCI 设置代码将中断控制器的引脚号写入每个设备的 PCI 配置头中。它使用其对 PCI 中断路由拓扑的了解以及设备 PCI 插槽号和它正在使用的 PCI 中断引脚来确定中断引脚(或 IRQ)编号。设备使用的中断引脚是固定的,并保存在该设备的 PCI 配置头中的一个字段中。它将此信息写入为此目的而保留的中断线字段。当设备驱动程序运行时,它会读取此信息并使用它向 Linux 内核请求对中断的控制。

IRQ 26因为 OP 中的 19 是内核代码和 CPU 处理的东西。根据 Linux 文档/IRQ.txt:

IRQ 编号是用于讨论硬件中断源的内核标识符。通常这是全局 irq_desc 数组的索引,但除了 linux/interrupt.h 实现的内容之外,细节是特定于体系结构的。

所以PCI首先接收到来自设备的中断,将中断源翻译成一个IRQ号并通知CPU。CPU 使用 IRQ 号查看中断描述符表 (IDT) 并找到正确的软件处理程序。

参考:

http://www.tldp.org/LDP/tlk/dd/interrupts.html http://www.brokenthorn.com/Resources/OSDevPic.html

于 2016-05-11T08:01:58.093 回答