我有一种情况,我需要分配多个 PCIE 设备可以 DMA 进出的内存。通过一些实验,我注意到当我在一个设备上调用 dma_alloc_coherent 并在另一台设备上调用 dma_map_single 时,我最终得到了相同的总线地址。这很棒,可以大大简化我的代码,但我只是很幸运,还是保证总是如此?代码最终需要在 x86_64 和 PowerPC 上运行。无论是否有 IOMMU 硬件,它也需要工作。
这只是一些示例代码来说明我在说什么。假设 dma_alloc_coherent 和 dma_map_single 都成功,我能保证得到“得到相同地址”的打印吗?或者至少我可以用我正在使用的当前 linux 内核(5.11.12)得到这个保证?
size_t size = 1024*1024*4;
dma_addr_t busAddr1;
dma_addrt_t busAddr2;
ptrKernVirt = dma_alloc_coherent(ptrDev1, size, &busAddr1, GFP_KERNEL);
if (ptrKernVirt)
{
busAddr2 = dma_map_single(ptrDev2, ptrKernVirt, size, DMA_BIDIRECTIONAL);
if (!dma_mapping_error(ptrDev2, busAddr2))
{
if (busAddr1 == busAddr2)
{
printk(KERN_ALERT "got same address!\n");
}
}
}