在具有 32 位设备(例如旧 NIC)的 x86_64 系统上:在 NIC 和 DRAM 之间进行 DMA 时,内存地址是否必须在较低的内存中(低于 4GB)?
顺便问一下,OS如何知道为PCI设备保留的内存地址空间资源,即BAR中存储的地址?
请参阅有关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 本身,首先确定内存大小要求,然后配置基地址。