免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: duanius

一个cache相关的问题 [复制链接]

论坛徽章:
0
发表于 2010-11-05 21:02 |显示全部楼层
回复 20# smalloc

一开始?我确实最先尝试的方式是一个cache一个非cache 因为我用的是remap_pfn_range来分配,但后面我也尝试了采用应用层cache的方式来试,还是不行,然后思考了下逻辑cache与物理cache的区别,才有了这篇文章。最后得出了在x86上,不关心cache,arm11上,要么同cache,要么同nocache,arm9上 只能同nocache的结论。我认为理论上也应该是正确的。

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
发表于 2010-11-05 21:06 |显示全部楼层
回复 21# duanius


    我承认还有一点不能确认.就是一个cache一个nocache为什么会不一致
我在找确着的证据.
不能简单通过用加了flush来证明这一点
比如我相信是因为指令乱序列造成的.而加flush不过是强制执行序列而已---虽然这个可能性很小

论坛徽章:
0
发表于 2010-11-05 21:14 |显示全部楼层
回复  duanius


    我承认还有一点不能确认.就是一个cache一个nocache为什么会不一致
我在找确着的证 ...
smalloc 发表于 2010-11-05 21:06



    这个是和体系结构相关的啊  x86随便你整 不管有没有cache都不用care(如果没记错的话) 人家拍胸脯担保了
但arm手册里面写明了一致性是需要你自己去care的,arm自己去刷cache只有一种情况,就是那一行要滚蛋,被换出了。所以比方说两边同时写,各写各的,cache行不被换出的话就是各自完各自的,谁也不知道对方在干吗。而且我认为,比如内核行cache一直有效,然后app拿了同样一片内存到cache或者直接访问内存,内核是不知道的,因为我目前没找到arm有任何机制确保它能知道。

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
发表于 2010-11-05 21:19 |显示全部楼层
回复 23# duanius


    顺便问下.ARM只能看手册吗 有没 see mips run 那样的中文书?

论坛徽章:
0
发表于 2010-11-05 22:46 |显示全部楼层
回复 24# smalloc


嵌入式系统开发-软件设计与优化 这本书 应该是经典中的经典吧
其实我觉得arm的体系结构相对x86要简单很多 比起i32开发者手册n卷动不动就是上k页,arm的东西随便翻翻一本书再看其他的都是雷同的了,而且内部的机制也确实比x86简单

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
发表于 2010-11-05 23:41 |显示全部楼层
本帖最后由 smalloc 于 2010-11-05 23:43 编辑

回复 25# duanius


    这本书真不错,以前发了几个帖子问.就是没有人推荐过...

找到了一个困惑的地方.可以做下实验:
思考原先的步骤:
刚开始是
在mmap的时候指定了nocache的方式写, 内核读带cache的, 这个时候有问题发生
然后
内核读取共享内存时执行flush_all_cache, 这样就成功了.

如果按上面几贴讨论.假定应用层肯定写到物理内存了, 但是不影响cache

在内核读的时候.如果4K没任何cache,那么读都是未命中的.那么一定正确,不管刷不刷缓存

如果是循环执行.
则这4K内可能有一部分或全部已经是cache
那么在第2次读之前即使刷了缓存,也不能保证所有的物理内存4K不被掩盖.因为刷缓存是将缓存的内容写入内存 当然前提是他们被修改了.
也就是说还有可能会出错.
也就是刷缓存后不能保证在缓存中再load的数据和 采用nocache写的数据保持一致.

论坛徽章:
0
发表于 2010-11-06 11:40 |显示全部楼层
其实我倒想起了一个实验  还是我原来的需求,用户nocache写,内核cache读。
一旦发现内核读的数据和用户写的数据不一致,用户就立刻停止写。
然后改为用户读。 过会用户就会发现虽然内核没去写,用户也没写,但数据就变了,原因就是内核cache的回写。我想应该是这样,不过懒得去试了。

论坛徽章:
0
发表于 2010-11-06 11:48 |显示全部楼层
本帖最后由 duanius 于 2010-11-06 12:02 编辑

回复 26# smalloc
你说的一cahce 一nocache 然后flush一次也会出问题  我想了想可能有这种可能性
不过对于内核读 app写  其实解决起来也简单  就是app写前flush  而不是写后flush  应该就o了把
总之逻辑cache屁事多 只要别名问题解决不了  怎么都可能出问题  如果用逻辑cache 还是老老实实的both nocache把

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
发表于 2010-11-06 11:51 |显示全部楼层
回复 27# duanius


    这个挺麻烦.
你只要在内核读完再在内核全部写不正确数据,然后用户再写.循环执行
就可以知道了.如果cache和写内存不能同步,则刷缓存后必定会不是每次正确

论坛徽章:
0
发表于 2010-11-06 12:17 |显示全部楼层
回复  duanius


    这个挺麻烦.
你只要在内核读完再在内核全部写不正确数据,然后用户再写.循环执行
...
smalloc 发表于 2010-11-06 11:51



28楼回复错了 重新编辑下
你这个也许行 但两边都写 还带刷缓存 太复杂太乱了 我看的晕晕乎乎的  
其实我这个代码实现很简单  而且逻辑也很清晰   内核只是读,不写 只有app写  居然都能把内存改掉  这还不够说明问题么?  别两边都写 ,还带flush,逻辑太复杂了。

这个问题到这应该就可以结束了,都通通透透的了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP