Linux 的 Consistent DMA mappings 的底层实现原理到底是什么?

2023-08-23 23:19:40 +08:00
 amiwrong123

https://blog.csdn.net/rlk8888/article/details/120115477

在这篇博客里提到:一个简单的想法就是,我们在做 DMA 传输的时候,这段 buffer 我把 cache 给关闭了,这个就是 kernel 实现的一致性的 DMA buffer mapping 的(英文叫做:Consistent DMA mappings )。这里 consistent 的意思是 synchronize 或者 conherent 的意思,CPU 和 DMA 这两个哥们都能同时看到数据的改变,不需要软件做额外的一些 flush 动作。

当然了,对特定的 buffer 关闭了 cache 功能,就会导致 CPU 写时会直接写到 ddr 里而不是写到 cache 里,读时总是从 ddr 里面读而不是 cache 里读。

但我想知道使用dma_alloc_coherent得到的地址,真的底层原理这么简单吗?是不是直接看dma_alloc_coherent的源码实现就能找到答案,但现在看起来有点费劲。

778 次点击
所在节点    程序员
2 条回复
zzz22333
2023-08-24 09:16:47 +08:00
可以通过 MMU 配置内存属性为 uncache
amiwrong123
2023-08-24 12:41:30 +08:00
@zzz22333
我的关键点在于,我还以为 Consistent DMA mappings 用到了什么高深的东西呢,比如 缓存一致性协议什么的。
结果只是 暴力把 cache 关掉了而已。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/967793

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX