基地址寄存器如何获取地址?

时间:2014-06-05 13:11:18

标签: linux enumeration pci addressing base-address

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

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

操作系统在启动期间是否设置了基址?或者它是如何工作的? 在这方面,我想知道如果连接pcie pcie设备,操作系统通常会做什么初始化。因为我确实在lspci中看到了我的pci设备,即使驱动程序被卸载了。

亲切的问候 托马斯

2 个答案:

答案 0 :(得分:1)

PCI设备的地址分配通常在BIOS级别完成。我们来参考x86平台。如果我们仔细观察系统地址图,就会出现这样的情况(图片取自BIOS DISASSEMBLY NINJUTSU,由Darmawan Salihun拍摄)

enter image description here

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

此实现依赖于平台,并且当BIOS“知道”有关平台时,它会留出专用于PCI插槽的地址。当设备插入插槽时,BIOS会与设备上的固件进行交互,并实际设置设备的内存区域,以便操作系统可以使用它。

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

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

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

答案 1 :(得分:0)

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

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