有关ArmV7-A缓存的另一个问题。 在这种情况下,所讨论的SoC是Allwinner A20,双核心Cortex-A7。
根据我的阅读,核心的PoU定义是核心的指令和数据缓存保证看到内存位置的相同副本的点。
对于所讨论的SoC,由于两个内核在L2(统一)高速缓存上共享PoU,这意味着无论在L1中放置什么,L2都可以看到。是对的吗?
即使我将内存区域的属性更改为不可共享,L2也能够看到核心中L1 内部的内容。这是真的吗?
为了阐述我的意思,我做了一个小实验:
当我从核心#0写入不可共享,回写区域内的内存地址时。然后,在没有进行任何缓存维护操作的情况下,当我尝试从核心#1读取相同的内存地址时,它恰好读取了从核心#0写入的正确值。
我推测这种行为是L2作为PoU的结果,因此,当我从核心#0写入时,L2也会存储它的副本(即使它没有被刷新)。然后当我从核心#1读取时,在读取未命中之后,核心#1的L1从L2中检索内存值。
答案 0 :(得分:1)
...由于两个内核在L2(统一)高速缓存中共享PoU,这意味着无论在L1中放置什么,L2都可以看到。是吗?
没有。一个CPU的数据访问可以窥探同一可共享域中另一个CPU的数据缓存,但这与PoU无关,用于指令访问;这只是一致性协议。
即使我将内存区域的属性更改为不可共享,L2也能够看到任一内核中的L1内部。这是真的吗?
没有。不可共享的内存不保证是连贯的。当然,你可能看到它的工作 - 也许Cortex-A7碰巧仍然窥探不可共享的缓存行,或者你的数据可能在此期间自然被驱逐出L1D,以至于其他CPU在L2 - 但绝对不应该依赖它。无论哪种方式,让多个CPU访问相同的不可共享位置在实践中是完全倒退的事情;你故意说你不想分享它!