[ZLG-ARM] Cache引起的数据错误

[复制链接]
 楼主| armqt 发表于 2009-7-9 13:36 | 显示全部楼层 |阅读模式
1.Cache的两个类型<br />&nbsp;&nbsp;&nbsp;&nbsp;--Write&nbsp;Through<br />&nbsp;&nbsp;&nbsp;&nbsp;当写数据进Cache时,也同时更新了相应的Memory里的内容<br />&nbsp;&nbsp;&nbsp;&nbsp;--Write&nbsp;back<br />&nbsp;&nbsp;&nbsp;&nbsp;只是写到Cache里,Memory的内容要等到cache保存的要被别的数据替换或者系统做cache&nbsp;flush时,才会被更新。<br /><br />2.Cache的两个函数<br />&nbsp;&nbsp;&nbsp;&nbsp;--Flush<br />&nbsp;&nbsp;&nbsp;&nbsp;把Cache内容写回Memory,当Cache为Write&nbsp;through,不需要Flush<br />&nbsp;&nbsp;&nbsp;&nbsp;--Invalidate<br />&nbsp;&nbsp;&nbsp;&nbsp;把Cache内容直接丢掉不要。<br /><br />3.Cache的使用场合<br />&nbsp;&nbsp;&nbsp;&nbsp;当有DMA在使用memory的时候,一般要用到cache的处理。因为DMA在访问memory时是不经过cache的。比较典型的比如在Ethernet,wireless,USB等driver里,DMA会操作descriptors和packet&nbsp;buffers,Driver要做这些处理<br />&nbsp;&nbsp;&nbsp;&nbsp;--如果driver使用descripter和packet&nbsp;buffer的地址都是cache的地址,那么<br />&nbsp;&nbsp;&nbsp;&nbsp;a).Driver在读descripter里一些状态比如Owned&nbsp;by&nbsp;CPU/DMA,有没有收到包时,要对descripter当前结构里的内容做cache&nbsp;invalidate,收到packet后,也要对packet&nbsp;buffer做cache&nbsp;invalidate<br />&nbsp;&nbsp;&nbsp;&nbsp;b).Driver在写descripter里一些状态比如Owned&nbsp;by&nbsp;DMA,要发送包时,要对descripter当前结构里的内容做cache&nbsp;flush,发送packet时,也要对packet&nbsp;buffer做cache&nbsp;flush<br />&nbsp;&nbsp;&nbsp;&nbsp;--有些driver会对descripter使用uncache&nbsp;地址,那么上面两种情况里invalidate/flush就不用做了。一般很少会对packet&nbsp;buffer也用uncache地址的,因为对packet内容的处理将会很频繁,使用uncache会很慢。而descripter一般由于结构比较小,如果也使用cache地址的话,做invalidate/flush的时间消耗可能会比uncache的还要多。<br /><br />
lpc2410 发表于 2009-7-9 14:07 | 显示全部楼层

  
tmake 发表于 2009-7-11 14:09 | 显示全部楼层

不错

  
菜鸟-轩 发表于 2012-2-17 14:59 | 显示全部楼层
讲的太好了
diny 发表于 2012-2-20 14:07 | 显示全部楼层
两年前的贴子了。这版块。。。。。:L
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

150

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部