对一致性DMA映射与流式DMA映射的一些粗浅认识

我在近期的工作中接触到了以下两种DMA映射的API:

  • 一致性DMA映射
dma_alloc_coherent()
  • 流式DMA映射
dma_map_single()

进而想要简单了解下其中的原理,最重要的是想弄明白两者之间的区别。

经过一番搜索,在大名鼎鼎的《Linux Device Drivers》与内核源码文档<dma-api-howto.rst>中找到了DMA映射相关的描述,但内容却不符合我心意,其描述重点在于API用法、在于“注意事项”,对于原理解析只有寥寥数笔,无法通过资料直接得到真相,我只能结合工作经验对照文档反复推敲,思索一段时间后,我对一致性DMA映射与流式DMA映射之间的区别有了初步认识,因此在这里分享出来,算作抛转引玉:

一致性DMA映射可以理解为简单粗暴地关闭了cache,以此保证数据一致性;
而流式DMA映射是怎么保证数据一致性的呢,它的方式更加复杂,让我们从数据的两个方向来分析:

  • DMA_TO_DEVICE
    CPU将数据写入cache,然后同步cache与RAM(映射区域),同步操作完成后设备再从RAM(映射区域)获取数据
  • DMA_FROM_DEVICE
    CPU标记RAM(映射区域)对应的cache line为无效状态,以避免设备将数据写入RAM(映射区域)后,CPU从cache中获得"脏数据"

从上述分析总结来看,流式DMA映射根据数据方向对cache进行"flush/invalid",既保证了数据一致性,也避免了完全关闭cache带来的性能影响。

既如此,为什么不抛弃一致性DMA映射,全面拥抱“更强大”的流式DMA映射呢?
我想到了一个场景来解释这个问题:
假设有一段内存空间,范围小且有被频繁访问的需求,在这种场景下,因为内存空间小,开/关cache对性能影响微乎其微,如果采用流式DMA映射反而带来了等同访问频次的"cache flush/invalid"操作,莫不如完全关闭cache,采用一致性DMA映射。

  • 13
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值