0

我有一种情况,我需要分配多个 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");
             }
         }
    }
4

0 回答 0