如何在带有32b PCI设备的x86_64系统上使用DMA内存

时间:2012-08-17 13:40:36

标签: memory pci dma

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

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

1 个答案:

答案 0 :(得分:4)

请参阅PCI configuration space上的维基百科条目。 PCI BAR位用于传达存储器寻址要求,并在PCI枚举期间配置。

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

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

同样,在配置期间,PCI设备通过BAR传达其存储器要求,并且OS最终设置BAR地址。

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

  

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

总结:
这取决于设备硬件的功能。

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