我试图在启动时将“mem”参数传递给Linux时使用我保留的连续内存。
现在,我已经预先保留了这个空间的物理地址,以及它的长度,我希望在我的驱动程序中使用这个保留空间用于DMA目的。
通常我会使用dma_alloc_coherent()
,如果我使用的是CMA,我也会使用它,但在这种情况下,它会有所不同。
现在,我已经读过将物理空间映射到内核虚拟空间的可接受方法是使用ioremap
并且,为DMA目的“接管”连续空间的可接受方式是使用dma_map_single
(将其映射为总线地址)
我在将两者结合起来时遇到了麻烦。 ioremap
工作并返回虚拟地址。现在,我已经读过这不是普通的虚拟地址,我应该只使用访问方法来读取/写入这个内存。
事情是,当我尝试将此虚拟地址传递给dma_map_single
时,它不报告错误,但我怀疑这是错误的。
我做得对吗?我能做些什么让它像它应该的那样工作?
10倍
答案 0 :(得分:2)
你做得对 您不需要分配内存,因为您已经在启动时设置了它,但是您需要使用dam_map_single来防止缓存问题,例如,如果您想从内存到设备执行DMA但RAM不与L2同步缓存(缓存有更新的版本)您将获得错误的数据,因此您需要在DMA操作之前和之后映射和取消映射