为 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操作前后映射和取消映射
我正在尝试使用在引导时将 "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操作前后映射和取消映射