【发布时间】:2016-03-21 13:20:14
【问题描述】:
我正在尝试使用我在引导时将“mem”参数传递给 Linux 时保留的连续内存。
现在,我有了我之前保留的这个空间的物理地址,以及它的长度,我希望在我的驱动程序中利用这个保留的空间进行 DMA。
通常我会使用 dma_alloc_coherent() ,如果我使用 CMA 我也会使用它,但在这种情况下,它会有所不同。
现在,我读到将物理空间映射到内核虚拟空间的一种可接受的方法是使用ioremap
并且,为 DMA 目的“接管”连续空间的可接受方式是使用 dma_map_single(将其映射为总线地址)
我无法将两者结合起来。 ioremap 工作并返回一个虚拟地址。现在,我读到这不是普通的虚拟地址,我应该只使用访问方法来读取/写入这个内存。
问题是,当我尝试将此虚拟地址传递给 dma_map_single 时,它不会报告错误,但我怀疑这是错误的。
我做得对吗?我该怎么做才能让它正常工作?
10 倍
【问题讨论】:
-
我懒得搜索了,但在这个网站上这个问题每年都会发生一次。
-
谢谢。也许我不擅长搜索,但我确实搜索并发现了不同的变体,但与我的情况完全不同。
标签: c linux linux-kernel driver dma