yon*_*igo 0 memory-management linux-device-driver linux-kernel dma
我正在写一个PCI设备驱动程序,我需要为DMA分配一些内存,我正在使用这个函数:
void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, int flag);
Run Code Online (Sandbox Code Playgroud)
我将dma_handle传递给设备.
这个函数的返回值是我可以在内核中使用的虚拟地址,事情是我不想为每个内存分配保存这个地址.
有没有办法将物理地址dma_handle转换为我可以在内核中使用的地址?像这些函数/宏之一的东西:
virt_to_page(kaddr)
page_to_pfn(page)
Run Code Online (Sandbox Code Playgroud)
是否有phy_to_kvirt宏/函数或任何其他方式将物理地址转换为内核虚拟地址?
谢谢
不,没有,而dma_handle不只是任何实际地址.从特定设备的角度来看,它是物理地址.不同总线上的不同设备可能具有完全不同的主存储器视图.除此之外,返回的虚拟地址可以是动态映射的页面,而不是与主存储器的物理映射具有固定的关系.
有可能是在内核结构的足够的信息拼凑的信息在特定总线和架构,但没有保证,不要指望它要快-内核自己的dma_free_coherent()要求您提供的一切,虚拟地址,设备和dma_handle到做它的工作,因为这是它可以跨架构和总线普遍工作的唯一方法.
只是重申:dma_handle本身毫无意义.多个设备可能具有完全相同的dma_handle,仍然指向不同的内存位置.