1

在具有 32 位设备(例如旧 NIC)的 x86_64 系统上:在 NIC 和 DRAM 之间进行 DMA 时,内存地址是否必须在较低的内存中(低于 4GB)?

顺便问一下,OS如何知道为PCI设备保留的内存地址空间资源,即BAR中存储的地址?

4

1 回答 1

4

请参阅有关PCI 配置空间的 Wikipedia 条目。PCI BAR 位用于传达内存寻址要求,并在 PCI 枚举期间进行配置。

如果 PCI 设备是 32 位的(意味着它只能处理 32 位地址),它可能会将“Locatable”值设置为“0”(任何 32 位),从而将地址保持在 4GB 以下。

如果设备可以处理 64 位地址,它会将“Locatable”设置为 2。

同样,在配置期间,PCI 设备通过 BAR 传达其内存需求,操作系统最终设置 BAR 地址。

引用有问题的维基百科部分:

当对指定 BDF 组合供应商 ID 寄存器的读取成功时,BIOS 或 OS 知道它存在。它将所有 1 写入 BAR,并以 0 的形式读回设备请求的内存大小,其中不关心地址所在的位置。(原文如此)

总结一下:
这取决于设备硬件的能力。

在 PCI 设备枚举期间,一旦主机操作系统找到了 PCI 设备,它就会使用 BAR 位向设备询问内存地址位置信息。它在两步过程中使用 BAR 本身,首先确定内存大小要求,然后配置基地址。

于 2012-10-24T14:25:40.747 回答