【dma】关于dma pool的疑问
LDD上介绍dma pool的时候说“在对内嵌于某个大结构中的小型区域执行dma时,也可以使用dma池。一些不容易觉察的驱动程序
一致性缓存错误,往往存在于结构中与小型DMA区域相邻的成员中。为了避免这一问题的出现,应该总是显式的为dma操作分配区域,
而与其他非dma数据结构的操作分开”
这句话怎么理解?
本帖最后由 镇水铁牛 于 2015-02-08 09:36 编辑
摘抄的文字不全吧。
1. dma是硬件资源,看你如何管理和使用,pool也只是一种使用方式而已,好比mem pool。
2. dma是直接操作总线的,数据传输不经过cpu,但是如果dma的目的地址的数据被cpu cache的话,就会产生数据一致性的问题,解决办法:禁止DMA目标地址范围内的cache功能(会牺牲点性能),如dma_alloc_coherent 回复 2# 镇水铁牛
这个不是我想要的答案。
关于上面那句话能否举个具体例子说明一下。 本帖最后由 Tinnal 于 2015-02-10 09:20 编辑
回复 1# linuxlife123
好像还是不是很好理解,让我再想想。 原文是这么说的:
DMA pools are also useful in situations where you may be tempted to
perform DMA to small areas embedded within a larger structure. Some very obscure
driver bugs have been traced down to cache coherency problems with structure fields
adjacent to small DMA areas. To avoid this problem, you should always allocate
areas for DMA operations explicitly, away from other, non-DMA data structures.
关键是标红的这句,原理上说这个区域是分配出来的,怎么可能钳在更大的结构体里呢?除非按这个“更大的结构体”一起分配。 回复 6# Tinnal
最近碰到一个问题,有个驱动,用dma_alloc_coherent的话,中断来了以后,去读数据,则读出的数据都是0,实际上驱动异常退出以后去检查这块内存,发现是有数据的。但是用dma_pool_alloc,则中断来了以后去读数据就是ok的。搞不明白。。
页:
[1]