为 DMA 使用保留内存

Reserving memory for DMA usage

我正在尝试使用在引导时将 "mem" 参数传递给 Linux 时保留的连续内存。

现在,我有了之前保留的这个 space 的物理地址和它的长度,我希望在我的驱动程序中将这个保留的 space 用于 DMA 目的。

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

现在,我读到将物理 space 映射到内核虚拟 space 的可接受方法是使用 ioremap

而且,为了 DMA 目的 "taking over" 一个连续的 space 可接受的方法是使用 dma_map_single(将其映射为总线地址)

我无法将两者结合起来。 ioremap 有效,returns 一个虚拟地址。现在,我读到这不是普通的虚拟地址,我应该只使用从该内存访问 read/write 的方法。

事实是,当我尝试将此虚拟地址传递给 dma_map_single 时,它没有报告错误,但我怀疑这是错误的。

我做的对吗?我该怎么做才能让它正常工作?

10 倍

你做得对 您不需要分配内存,因为您已经在启动时设置了它,但是您需要使用 dam_map_single 来防止缓存问题,例如,如果您想从内存到设备执行 DMA,但 RAM 不是与L2缓存同步(缓存有较新版本)你会得到错误的数据所以你需要在DMA操作前后映射和取消映射