不使用 clflush 逐出缓存行

Evict cache line without clflush

我想基于 Yarom 和 Falkner 的 FLUSH+RELOAD 攻击实施 EVICT+RELOAD,但不使用 clflush 指令从缓存中逐出数据。

我对cache lines和pages有一个大概的了解,例如,这个post解释的很简洁。我知道缓存行是缓存中的最小单位。在我的系统上,缓存行有 64 个字节。内存页是指固定长度的连续虚拟内存块。

但是,我不太明白如何实现它。我很清楚我需要覆盖缓存中的现有数据。另外,我知道缓存是根据访问的地址填满的。但是,如果缓存透明地工作,我如何有选择地覆盖特定的缓存行?

// 附录

问题 的 post 还提到逐出是一种从缓存中删除数据的策略:“或者当然为已知的 L1d 大小和关联性创建冲突逐出,例如写入4kiB 倍数的多行都映射到 32k / 8 路 L1d 中的同一组。”但是它没有提供任何关于如何完成它的细节。

根据具体的缓存设计,只有内存中的某些缓存行可以放入缓存中的某些缓存行组(“集合”)。

例如,也许每个页面上的相同字节总是进入相同的缓存集(字节 64-127 总是进入缓存集 1)。在这种情况下,如果你想驱逐它,你将访问第 0 页的字节 64-127、第 1 页的字节 64-127、第 2 页的字节 64-127、第 3 页的字节 64-127,...向上到集合中缓存行的数量。然后您知道第 100 页的字节 64-127 不再 在缓存中,因为您只是用不同的字节填充了缓存集。