我有一个不寻常的情况,我正在为以太网设备开发模拟模块。理想情况下,模拟层与寄存器组的真实硬件相同。我遇到的问题是硬件中的DMA寄存器加载了数据的DMA映射(物理)地址。我需要使用这些物理地址将数据从源设备上的Tx缓冲区复制到目标设备上的Rx缓冲区。要在模块代码中执行此操作,我需要指向虚拟内存的指针。我查看了phys_to_virt(),我在手册页中不理解这个评论:
This function does not handle bus mappings for DMA transfers.
这是否意味着使用phys_to_virt()无法将通过dma_map_single检索的物理地址转换回虚拟地址?还有另一种方法可以实现这种转换吗?
答案 0 :(得分:0)
我对这个问题不是很清楚,但是如果你使用"phys_to_virt()"
可能是这个函数无法将总线上可用的地址转换为虚拟的原因。我不确定只是尝试bus_to_virt(bus_addr);
function
答案 1 :(得分:0)
没有任何将DMA地址映射到虚拟地址的通用方法。 dma_map_single()函数可能正在编程IOMMU(例如Intel x86系统上的VT-d),这会导致DMA地址与原始物理或虚拟地址完全无关。但是this presentation和链接的幻灯片提供了一种方法,可以将模拟的硬件模型连接到真正的驱动程序(基本上,使用虚拟化)。
答案 2 :(得分:0)
尝试dma_virt = virt_to_phys(bus_to_virt(dma_handle))
dma_coherent_alloc()
映射的相同虚拟地址。