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