我使用2个ARM板进行DMA远程读写。 启用SMMU后,我在获取物理地址时遇到一个问题,这是将物理地址映射到用户空间中的内核地址所需的。
当前,我正在尝试禁用SMMU。 这是流程:
ker_addr =(u64)dma_alloc_coherent(... dma_addr_t bus_addr); //投射会导致任何问题吗?
phys_addr = bus_addr;
mmap(... phys_addr);
vma-> vm_page_prot = pgprot_noncached(vma> vm_page_prot);
remap_pfn_range(vma,vma-> vm_start,vma-> vm_pgoff, vma-> vm_end-vma-> vm_start,vma-> vm_page_prot));
但是,导致了无法翻译的页面错误。 在自定义驱动程序中注释pgprot_noncached时,我没有发现任何错误。 请帮助我了解原因。
还建议将remap_pfn_range()替换为dma_mmap_coherent()吗? 据我所知,remap_pfn_range()处理的是物理地址,而dma_mmap_coherent()处理的是dma_alloc_coherent()给定的总线地址。 请让我知道是否不同。
谢谢!