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

jia*_*iam 5 boot linux-kernel pci

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

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

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

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

Sun*_*lly 6

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

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

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