2016-03-21 48 views
1

我想在启动时将“mem”参数传递给Linux的同时使用保留的连续内存。为DMA使用保留内存

现在,我有我早先保留的这个空间的物理地址,以及它的长度,我希望在我的驱动程序中使用这个保留空间用于DMA目的。

通常我会使用dma_alloc_coherent(),如果我使用CMA,我也会使用它,但在这种情况下,它与众不同。

现在,我已经阅读了映射的物理空间到内核虚拟空间的可接受的方法是使用ioremap

而且,的“接管”一个连续的空间用于DMA的目的是使用dma_map_single一种可接受的方式(映射它的总线地址)

我无法结合这两者。 ioremap工作并返回一个虚拟地址。现在,我已经读过,这不是普通的虚拟地址,我应该只使用访问方法从这个内存中读/写。

事情是,当我试图通过这个虚拟地址dma_map_single,它不报告错误,但我怀疑这是错误的。

我在做对吧?我能做些什么来使它像它应该那样工作?

10X

+0

我太懒了搜索,但在这个网站上,这个问题每年发生一次。 – 0andriy

+0

谢谢。也许我不擅长搜索,但我搜索并找到了不同的变体,但没有像我的情况。 –

回答

2

你正在做正确的 你并不需要分配内存,因为你已经把它放在开机时间,但你需要使用dam_map_single防止例如缓存出现了问题,如果你想要做一个DMA从内存到设备但内存不与L2缓存同步(缓存的版本较新),您将得到错误的数据,因此您需要在DMA操作前后映射和取消映射

+0

谢谢。我不确定传递dma_map_single ioremapped地址是否正确。 –

+0

@Liran对不起,但是使用ioremap创建的内存映射没有被缓存,所以它可以直接传递给dma的设备? – shunty

+0

如果您从一个io内存复制到其他内存,但是大多数情况下,您可以从DDR复制到设备(或相反),并且DDR可以被缓存。 –