微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > 微电子学习交流 > 问个CPU的data cache问题

问个CPU的data cache问题

时间:12-12 整理:3721RD 点击:
CPU的data cache是否会把最近访问的数据(无论地址范围)都会存放起来,一直到data
cache放满,然后新访问的数据会把原来的覆盖。
CPU访问数据时,先看data cache中是否有,如果有,则取data cache中的数据; 如果
没有,再去实际的地址取数据。
不知道以上对data cache的理解有没有问题?
如果我在CPU中运行中修改了某个数据,恰好这个数据在data cache中有缓存。那么我修
改的数据是不是不会生效? 如何解决这个问题?
谢谢

你随便找本计算机体系结构的书翻翻,就能搞清楚这些问题
映射和替换
查找
回写和一致性

方便的话,你直接解答下,谢谢

  基本正确。你修改数据要向内存写,如果CACHE里面有,有两种方式,一种是
  在这个块要被替换掉的时候写入内存,一种是每修改一次CACHE就修改一次内存

看这个修改数据应该存的位置的memory属性。这样决定了修改值是否会回写到对应位置。

cache的理解没有错,很正确,那么如何将数据写入外设或者不需要cache的地址呢,这里就引出了MGU或者MMU,你把不需要cache的地址设置成不可cache就可以。

"如果我在CPU中运行中修改了某个数据,恰好这个数据在data cache中有缓存。那么我修
改的数据是不是不会生效? 如何解决这个问题?"
1. 首先,这种情况应该是很少见的,这意味着刚设置的cache entry马上就被evict了,cache thrashing
2. 其次,要回答这个问题涉及到CACHE的三个policy中的两个(假定memory是设置成chacheable的) [take ARM architecture for example]
Allocation Policy
如果此时是Read Allocation,那么不会设置cache,会直接写回memory
如果此时是Write Allocation,肯定会建立cache,会不会写回memory取决于Write Policy
如果是write-back,则会设置cache的dirty bit,但是不会写回memory,这个写回动作会推迟到这块cache被evict
如果是write-through,则会直接写回memory

“很正确”?第一句话就不严谨吧——如果是访问non-cacheable的地址,数据就会绕开cache直接写到下一级存储空间

violate关键字不是用于这个场合吧

  一般说的是硬件修改寄存器。但是就算是其他硬件中断修改了寄存器,
  仍然也会影响到寄存器写往CACHE,接着CACHE被窜改的数据就读到内存里面去了。
  
  为了防止编译器优化,要求所有的硬件及中断要访问某个变量,都要直接访存而不
  访CACHE,也是一种情况。任何对该存储器变量的修改都要进行相应的内存写操作而
  不得只进行CACHE写。
  我的理解。实际上我经常用,没碰到什么异常情况,凡事不确定都统统定义成VOLATILE。
  要理解非常深入需要搞过编译器的人。
  俺是EMBEDDED硬件出身。理解到此。凡是多线程公用变量,如信号量,都定义成VOLATILE。

赞~

你说的这个和dcache有毛关系

论述的太有难度了,
没明白你说的
cpu---cache---memory
你说的是读取硬件端口数据?

  有关系。

如果是c和c++的volatile, 就是这个值在不同access之间会变化,
即使编译器分析不出来会变化
体现在编译器的操作就是不优化
memory map devices是适用场景之一
c/c++ 并没有规定volatile的atomic和memory consistency
对于多线程是无用的
只会干扰编译器工作,得到慢速运行结果
不过我也觉得这和dcache无甚关系
.56

  不理解读一个register里面的副本和一个cache里面的副本
  两种场景会不会都出现。
   某变量不会老存一副本在register里面吧,一般通用寄存器都
  是很多指令共用的,你老留一副本在那里不回写cache或者memory
  不出问题?
    如果是mmu设备,那么在write consistency的过程中不会被修改?
  会出现在cache回写memory过程中被篡改的情形么?
    另外一个,cache是sram还是register?

  看看这个解释
  www.cnblogs.com/heiyue/p/3274498.html

有点歪楼了,不过您的理解偏差挺大。
不严谨的说,volatile 的主要作用就是告诉编译器,它修饰的变量(内存位置)
值是不确定的,访问是会有软件不知道的副作用的,从而限制编译器做一些优化,
比如寄存器副本,merge, reorder等等。最直观的结果,就是每一次出现含该变量
的表达式,都会进行访存。
但是访存并不意味着一定是直接访问内存而不通过cache。cache 对软件是透明的,
程序无从得知它这一笔load 是从内存来,还是从cache 来,也无法控制一笔store
什么时候真正回写到内存,除非显式的flush。决定是否cachable的,不是volatile
修饰符,而是memory map,当然这个全世界都知道。
volatile 是必要的,但也危险,危险在误以为它可以控制硬件的行为,甚至能保证
一致性。但讲真,这些跟volatile 没什么关系。
volatile 在嵌入式软件中误用甚广,访问IO寄存器不得不靠它,加锁也靠它,
消息池多线程同步多核通信伤风感冒跌打损伤腰痛背痛全靠它,
好多好多,好多好多事情,臣妾想做,但做不到啊!偶尔跑飞一下,很了不起啦!
以上只是说C。在Java 等基于虚拟机的语言中的volatile,不懂,不敢乱说。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top