免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3871 | 回复: 11
打印 上一主题 下一主题

一个关于内存的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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完全不了解,求帮助! 谢谢!

论坛徽章:
0
2 [报告]
发表于 2013-08-19 19:59 |只看该作者
       啥平台

论坛徽章:
0
3 [报告]
发表于 2013-08-20 10:07 |只看该作者
那把image_buf定义成volatile可以吗?试试!

论坛徽章:
0
4 [报告]
发表于 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。

论坛徽章:
0
5 [报告]
发表于 2013-08-20 15:59 |只看该作者
用申请buffer的接口函数换成dma_alloc_coherent,申请一个一致性缓冲区试试?

论坛徽章:
0
6 [报告]
发表于 2013-08-20 19:20 |只看该作者
回复 5# hnzpzg


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

论坛徽章:
0
7 [报告]
发表于 2013-08-20 19:21 |只看该作者
已经找到了刷新L2的函数:
outer_flush_all();
调用这个函数后就好了,谢谢各位的回答。

论坛徽章:
0
8 [报告]
发表于 2013-08-21 09:03 |只看该作者
不错,恭喜!!!
我也在用海思的,hi3531

论坛徽章:
0
9 [报告]
发表于 2013-08-21 10:08 |只看该作者
L1不用刷吗?

论坛徽章:
0
10 [报告]
发表于 2013-08-22 19:46 |只看该作者
回复 9# hnzpzg


    看起来不刷也没有关系,
 但是我还是刷了,按道理需要
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP