0

我正在编写一个 PCI 设备驱动程序,我需要为 DMA 分配一些内存,我正在使用这个函数:

void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, int flag);

我将 dma_handle 传递给设备。

这个函数的返回值是一个我可以在内核中使用的虚拟地址,问题是我不想为我正在做的每个内存分配保存这个地址。

有没有办法将物理地址 dma_handle 转换为我可以在内核中使用的地址?类似于这些函数/宏之一:

virt_to_page(kaddr)
page_to_pfn(page)

是否有 phy_to_kvirt 宏/函数或任何其他方式将物理地址转换为内核虚拟地址?

谢谢

4

1 回答 1

5

不,没有,而且 dma_handle 不仅仅是任何物理地址。从特定设备的角度来看,它是一个物理地址。不同总线上的不同设备可能对主存储器有完全不同的看法。除此之外,返回的虚拟地址可能是一个动态映射的页面,而不是与主存的物理映射有固定的关系。

内核结构中可能有足够的信息来将某些总线和体系结构上的信息拼凑在一起,但不能保证并且不要期望它很快 - 内核自己的 dma_free_coherent() 要求您提供一切,虚拟地址,设备和 dma_handle 到做它的工作,因为这是它可以跨架构和总线普遍工作的唯一方式。

重申一下:dma_handle 本身是没有意义的。多个设备可能具有完全相同的 dma_handle,但仍引用不同的内存位置。

于 2013-10-30T13:29:30.460 回答