参考资料: 宋宝华:那些年你误会的Linux DMA(关于Linux DMA ZONE和API最透彻的一篇)-CSDN博客 https://blog.csdn.net/waterhawk/article/details/50723677 https://www.linuxidc.com/Linux/2012-09/69591p2.htm 注:本节有一些个人理解,如有误请谅解 dma_alloc_coherent与dma_alloc_writecombine的区别(无保证cache一致性情况下): dma_alloc_coherent 在 arm 平台上会禁止页表项中的 C (Cacheable) 域以及 B (Bufferable)域。而 dma_alloc_writecombine 只禁止 C (Cacheable) 域. C 代表是否使用高速缓冲存储器, 而 B 代表是否使用写缓冲区。 这样,dma_alloc_writecombine 分配出来的内存不使用缓存,但是会使用写缓冲区。而 dma_alloc_coherent 则二者都不使用。 C B 位的具体含义: 0 0 无cache,无写缓冲;任何对memory的读写都反映到总线上。对 memory 的操作过程中CPU需要等待。 0 1 无cache,有写缓冲;读操作直接反映到总线上;写操作,CPU将数据写入到写缓冲后继续运行,由写缓冲进行写回操作。 1 0 有cache,写通模式;读操作首先考虑cache hit;写操作时直接将数据写入写缓冲,如果同时出现cache hit,那么也更新cache。 1 1 有cache,写回模式;读操作首先考虑cache hit;写操作也首先考虑cache hit。 后面加了一条无保证cache一致性的情况下,原因在于假设使用dma_alloc_coherent使用了cache,就得进行不断地invalidate cache和TLB,并且还无法保证百分百不出问题,所以直接不使用cache缓存和缓冲 但是如果有硬件可以确保cache一致性的话,如CMN,那么dma_alloc_coherent就不一定不使用cache了,并且dma_alloc_coherent申请的物理内存也不一定是连续的,这跟芯片原厂实现方式强相关。具体可见参考资料的博客
标签:DMA,alloc,hit,dma,缓冲,cache,coherent,一致性 From: https://www.cnblogs.com/lethe1203/p/18107722