heyangya 发表于 2013-08-19 18:11

一个关于内存的问题

首先我在驱动中使用kmalloc,GFP_KERNEL申请了一块内存
然后在usb的complete函数中,对内存进行填充数据
应用程序会循环读取这块内存数据(使用的是物理地址),将内容显示到屏幕

现在的问题是发现图像有内容残缺不全,残缺内容随机。

我做了一些试验,发现如果对已填充好的数据,进行这样的操作,图像就可以显示完全:
u8 *xx=image_buf;//image_buf是缓冲区虚拟地址指针
memcpy(image_buf,xx,len);//len是缓冲区长度

我猜测是cache和内存不一致引起的,但是我使用了各种cacheflush操作,也没有起到作用。
而且感觉cache跟进程有关系,但是我这个是usb的complete函数。

对cache完全不了解,求帮助! 谢谢!

EZWORD 发表于 2013-08-19 19:59

:)       啥平台

wwxxxxll 发表于 2013-08-20 10:07

那把image_buf定义成volatile可以吗?试试!

heyangya 发表于 2013-08-20 15:19

平台是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。

hnzpzg 发表于 2013-08-20 15:59

用申请buffer的接口函数换成dma_alloc_coherent,申请一个一致性缓冲区试试?

heyangya 发表于 2013-08-20 19:20

回复 5# hnzpzg


    我要申请的是多个缓冲区,用这个函数内存不够。

heyangya 发表于 2013-08-20 19:21

已经找到了刷新L2的函数:
outer_flush_all();
调用这个函数后就好了,谢谢各位的回答。

wwxxxxll 发表于 2013-08-21 09:03

不错,恭喜!!!
我也在用海思的,hi3531

hnzpzg 发表于 2013-08-21 10:08

L1不用刷吗?

heyangya 发表于 2013-08-22 19:46

回复 9# hnzpzg


    看起来不刷也没有关系,
 但是我还是刷了,按道理需要
页: [1] 2
查看完整版本: 一个关于内存的问题