我正在阅读MDS攻击文件RIDL: Rogue In-Flight Data Load。将页面设置为写回,直写,写合并或不可缓存的页面,并通过不同的实验确定行填充缓冲区是微体系结构泄漏的原因。
切线:我知道内存可能是不可缓存的,但是我假设可缓存数据始终缓存在回写缓存中,即,我假设L1,L2和LLC始终是回写缓存。
我阅读了Computer Architecture book中回写和直写式缓存之间的区别。它说:
直写式缓存更易于实现,可以使用写缓存独立于高速缓存来更新内存。此外,错过读便宜些,因为它们不触发存储器写操作。在另一一方面,回写式缓存导致较少的传输,从而允许更多的带宽到执行DMA的I / O设备的内存。此外,减少数量随着我们向下移动层次结构和传输时间增加。通常,层次结构中越深的缓存越多可能会使用回写而不是直写。
因此,直写式缓存更易于实现。我可以看到这是一个优势。但是,如果可以通过页表属性设置缓存策略,那么就没有实现上的优势-每个缓存都必须能够以写回或直写方式工作。
每个缓存(L1,L2,LLC)都可以写回或直写模式工作吗?
在大多数x86微体系结构中,是的,所有数据/统一缓存都(能够)回写,并以该模式用于所有普通DRAM。 Which cache mapping technique is used in intel core i7 processor?有一些详细信息和链接。除非另有说明,否则任何谈论x86的默认假设是DRAM页将是WB。
[AMD Bulldozer做出了非常规的选择,使用直写式L1d和它与L2之间的4k写合并小缓冲区。(https://www.realworldtech.com/bulldozer/8/)。这有很多缺点,我认为(事后看来)这是Bulldozer系列(AMD为Zen修复的)的几个缺点甚至设计错误之一。还请注意,Bulldozer是CMT而不是SMT的实验(两个弱整数整数共享一个FPU / SIMD单元,每个内核都具有共享L2缓存的单独的L1d缓存)https://www.realworldtech.com/bulldozer/3/显示了系统架构。
但是,当然,Bulldozer L2和L3高速缓存仍然是WB,建筑师并没有发疯。 WB缓存对于减少共享LLC和内存的带宽需求至关重要
。甚至直写式L1d都需要一个写合并缓冲区,以允许L2高速缓存更大和更慢,从而达到其有时会在L1d未命中时命中的目的。另请参见Why is the size of L1 cache smaller than that of the L2 cache in most of the processors?因此,如果将页面属性设置为直写,那么它们全部都是直写的?
是的,每个商店都必须在标记为WT的页面中一直到DRAM。
缓存针对WB进行了优化,因为这是每个人都使用的方法,但是显然确实支持将行传递到外部缓存,而无需退出L1d。 (因此WT不会将存储变成movntps
绕过/逐出存储的东西。)
何时应将页面设置为直写?有什么好处?
基本上从不; (几乎?)所有CPU工作负载都最适合WB内存。
OS甚至不费心让用户空间分配WC或WT DRAM页面变得容易(或可能?)。 (尽管那当然不能证明它们never
有用。)例如在CPU cache inhibition上,我发现a link关于一个Linux补丁,该补丁从未进入主线内核,从而增加了映射页面WT的可能性。WB,WC和UC分别对于普通DRAM,设备内存(尤其是GPU)和MMIO是通用的。
[我已经看到至少一篇论文以WT,WB,UC,WC为基准对某些工作负载进行了基准测试(谷歌搜索,但没有找到,抱歉)。而且人们测试模糊的x86内容有时会出于完整性考虑将其包括在内。例如The Microarchitecture Behind Meltdown通常是一篇不错的文章(并且与您正在阅读的内容有关)。
WT的少数优点之一是,商店会立即终止在L3中,其他核心的负载可能会受到打击。
可能值得为该页面的每个商店支付额外费用,尤其是当您小心时手动将写入内容合并到一个大型的32字节AVX存储中。 (或64字节AVX512全行写入。)当然,仅将该页面用于共享数据。不过,我从未见过有人推荐这样做,这不是我尝试过的事情。可能是因为通过L3进行写操作所需要的额外DRAM带宽在大多数用例中也不值得。但也可能是因为您可能必须编写内核模块才能以这种方式映射页面。