3

我已经完成了在 linux 发行版下为 FPGA 开发的 pcie 驱动程序。一切正常。但我想知道 FPGA 的 PCI 端点中的基地址寄存器在哪里获得基地址。当我生成 PCIe 端点时,我能够设置 BAR 的长度,但不能设置更多。

在 PCIe 驱动程序中,我执行 pci_enable_device 之类的标准功能,但我没有专门设置基地址。

那么操作系统在启动时会设置基地址吗?或者它是如何工作的?顺便说一句,我想知道如果连接了 pcie pcie 设备,操作系统通常会做什么初始化。因为即使驱动程序已卸载,我也确实在 lspci 中看到了我的 pci 设备。

亲切的问候托马斯

4

2 回答 2

1

PCI 设备的地址分配通常在 BIOS 级别完成。让我们参考x86平台。如果我们仔细查看系统地址映射,它会是这样的(图片来自 BIOS DISASSEMBLY NINJUTSU,由 Darmawan Salihun 拍摄)

在此处输入图像描述

在地址映射上,有一个专用空间来映射 PCI 内存区域。可以使用 的输出复制相同的内容/proc/iomem

这种实现依赖于平台,并且由于 BIOS“了解”平台,它会留出专用于 PCI 插槽的地址。当设备插入插槽时,BIOS 与设备上的固件交互,并实际为设备设置内存区域,以便操作系统可以使用它。

现在来到驱动程序部分。在 Linux 中,驱动程序遵循称为“Linux 设备模型”的特定标准,该标准由核心层(PCI 核心)、主机控制器驱动程序(PCI 控制器/主控器)和客户端驱动程序(PCI 设备)组成。当 PCI 设备(客户端)插入插槽时,相应的主机控制器知道该附件,并进一步通知 PCI 核心,因此出现在lspci.

lspci显示由主机控制器识别的设备,在这种情况下,它可能会或可能不会绑定到驱动程序。核心进一步遍历系统中的驱动程序,找到匹配的驱动程序,并附加到该设备。

因此,您在输出中看到该设备的lspci原因是主机控制器已识别该设备,并已通知 PCI 核心。即使任何驱动程序连接到设备也没关系。

于 2014-08-01T10:36:57.843 回答
0

在大多数消费级计算机上,BAR 分配似乎是在 BIOS 中完成的。

我想在支持热插拔的架构中,这必须由操作系统完成或至少由操作系统触发。

于 2014-06-15T08:10:25.663 回答