我在Linux系统上连接了PCIe的FPGA卡。我可以重新编程FPGA,然后echo 1 > /sys/bus/pci/rescan
,我的卡显示在lspci
。
然而BAR区域没有分配任何内存:
Region 0: Memory at <unassigned> (64-bit, prefetchable) [disabled] [size=32M]
Region 2: Memory at <unassigned> (64-bit, prefetchable) [disabled] [size=64M]
我在Linux启动命令行上尝试了各种pci=
标志,但影响不大。
我怀疑BAR区域太大,因此Linux无法在地址空间中找到适当对齐的范围来映射BAR,因为它们在启动时不会出现。
这是正确的理论吗?是否可以告诉Linux为我的设备预留空间?
答案 0 :(得分:1)
我在Linux中也看到了这一点。在http://forums.xilinx.com/t5/PCI-Express/Incorrect-assignment-of-64bit-BAR-addresses/td-p/347577的Xilinx论坛上有一个答案 - 但你的记忆空间很小。尝试缩小大小,直到获得分配。
很可能你的BIOS不允许这么大的内存空间BAR。 实际上我从未见过超过512MB的真正PCIe设备 映射到内存空间。你为什么想做这个?如果你认为 有理由,再次检查你的申请是否真的 要求始终可以访问此数量的内存 时间或者你也可以使用分页机制处理这个问题。
您的怀疑很接近,但是BIOS正在分配区域,而不是Linux。正如我所看到的那样,根端口被给予一个固定的内存块,如果你在那个块中要求的不仅仅是免费的,那么你就可以进行未分配。
答案 1 :(得分:0)
只是猜测:当司机首先映射地址时,会为这些地区分配地址。
答案 2 :(得分:0)
Tom Keddie说,BIOS,而不是Linux内核,为设备分配地址区域。我发现有时你需要重新启动Linux系统才能让它映射设备。根据您配置FPGA的方式,您可能需要为FPGA提供外部电源,以便在重新启动时不会清除其配置。