一个关于内存的问题
首先我在驱动中使用kmalloc,GFP_KERNEL申请了一块内存然后在usb的complete函数中,对内存进行填充数据
应用程序会循环读取这块内存数据(使用的是物理地址),将内容显示到屏幕
现在的问题是发现图像有内容残缺不全,残缺内容随机。
我做了一些试验,发现如果对已填充好的数据,进行这样的操作,图像就可以显示完全:
u8 *xx=image_buf;//image_buf是缓冲区虚拟地址指针
memcpy(image_buf,xx,len);//len是缓冲区长度
我猜测是cache和内存不一致引起的,但是我使用了各种cacheflush操作,也没有起到作用。
而且感觉cache跟进程有关系,但是我这个是usb的complete函数。
对cache完全不了解,求帮助! 谢谢! :) 啥平台 那把image_buf定义成volatile可以吗?试试! 平台是ARM A9,海思3716MV300
32K icache 32K dcache
256K L2
物理地址 , 物理tag.
使用volatile是没有用的,我试过。
我又做了个实验:
u8 *xx=kmalloc(len,GFP_ATOMIC);//image_buf是缓冲区虚拟地址指针
memcpy(xx,image_buf,len);//len是缓冲区长度
这样图像也不会出错。
我觉得,cache的写策略应该是write-back,上面由于读cache时替换cache,然后cache中的内容被写回memory.
但是我还是不知道,怎么手动将cache刷回内存,或者屏蔽cache。
用申请buffer的接口函数换成dma_alloc_coherent,申请一个一致性缓冲区试试? 回复 5# hnzpzg
我要申请的是多个缓冲区,用这个函数内存不够。 已经找到了刷新L2的函数:
outer_flush_all();
调用这个函数后就好了,谢谢各位的回答。 不错,恭喜!!!
我也在用海思的,hi3531 L1不用刷吗? 回复 9# hnzpzg
看起来不刷也没有关系,
但是我还是刷了,按道理需要
页:
[1]
2