谁以及何时分配PCI / PCIe设备BAR的基地址?

时间:2015-02-03 08:51:28

标签: linux-kernel boot pci

我正在寻找内核如何进行PCI / PCIe枚举和BAR分配。

我认为内核会在启动时分配BAR的PCI基地址,但是当我尝试pci earlydump(在内核初始PCI子系统之前)看到BARs valuse时,我发现所有的基地址都已经分配了!这是否意味着BIOS执行PCI / PCIe枚举和BAR分配? BIOS如何知道每个pci设备的基地址并分配这些地址而不会发生冲突?

如果是这样,嵌入式系统(没有BIOS)如何枚举和分配PCI / PCIe设备的基地址?

顺便说一句,我的电脑是Ubuntu 14.04.1 LTS(x86_64)

1 个答案:

答案 0 :(得分:2)

在所有与IBM PC兼容的计算机上,BAR由BIOS分配。 Linux只是扫描总线并记录BAR值。

一些MIPS板采用类似的方法,其中BAR由固件分配。但是,固件分配BAR的质量差别很大。有些固件只是将BAR分配给板载PCI设备,而忽略所有附加PCI卡。在这种情况下,Linux不能仅仅依赖于固件的分配。

还有另一个问题,取决于固件分配。您需要坚持使用固件设置的地址范围。换句话说,如果固件将PCI内存空间从0x10000000分配到0x14000000,则无法轻松将其移动到Linux中其他位置的其他地址空间。资料来源:Bar asssignment in Linux