我有一个具有4个核的多核系统,每个核都有专用的L1和L2缓存以及共享的LLC。缓存具有包容性,这意味着高级缓存是低级缓存的超集。我可以直接刷新LLC上的块,还是必须先通过较低级别的块?
我试图了解flush + reload和flush + flush缓存端通道攻击。
答案 0 :(得分:1)
clflush
在体系结构需要/保证逐出从缓存中的各级线,使其成为提交数据到非易失性的DIMM是有用的。 (例如电池供电的DRAM或3D XPOINT)。
The wording in the manual似乎非常清楚:
在缓存一致性域中的缓存层次结构的每个级别都无效...如果该缓存行在缓存层次结构的任何级别上包含已修改的数据,则该数据将写回到内存中
我认为,如果多个核心具有共享状态的线,clflush
/ clflushopt
在一个芯具有从所有内核的专用高速缓存驱逐它。 (这将无论如何发生从包容L3高速缓存逐出的一部分,但SKYLAKE微架构-X变更为NINE(不包不排他)L3超高速缓存。)
我可以直接刷新LLC上的块,还是必须先通过较低级别的块?
不明确你在问什么。您是否在问是否可以要求CPU仅从L3刷新块而不干扰L1 / L2?您已经知道L3在大多数Intel CPU上都包含在内,因此最终效果将与clflush
相同。为了使内核与L3进行通信,它们必须经历自己的L1d和L2。
clflush
仍然有效。它不是预取之类的“提示”,也不是仅限于本地的东西。
在将来的Silvermont系列CPU中,将有一条cldemote
指令,可让您将块刷新到 LLC,但不能一直刷新到DRAM。 (而且这只是一个提示,所以它不会强制CPU服从它,如果回写路径正忙于搬迁,以腾出空间需求负载。)