【发布时间】:2020-01-21 18:30:10
【问题描述】:
我想获取与分配有dma_alloc_coherent 的内存块相关联的 PFN,以便与 PCIe 设备一起使用,如下所示:
unsigned long pfn;
buffer = dma_alloc_coherent(&pcie->dev, size, &bus_addr, GFP_KERNEL);
// Get PFN?
virt_to_phys(buffer) >> PAGE_SHIFT;
我知道这可能不是正确的方法,但它似乎有效......我只是在寻找正确的解决方案来转换潜在的总线地址(因为我不知道是否有 IOMMU ) 到 PFN。提前致谢。
注意:内核中似乎有一个名为 dma_to_pfn 的 ARM 函数,这似乎正是我需要的,但对于 x86。
【问题讨论】:
-
我认为正确的方法是通过 PFN 遍历并比较必要的信息。我可以问你为什么需要那个吗?是的,IOMMU 可能会做一些有趣的事情,而这些事情不允许你做上述事情(例如,在使用反弹缓冲区时)。
标签: linux-kernel linux-device-driver