0

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

我对缓存行和页面有一个粗略的了解,例如,这篇文章简洁地解释了它。我知道缓存行是缓存中的最小单位。在我的系统上,一个缓存行有 64 个字节。内存页是指固定长度的连续虚拟内存块。

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

// 附录

问题的帖子有没有办法刷新与程序相关的整个 CPU 缓存?还提到驱逐是一种从缓存中删除数据的策略:“或者当然为已知的 L1d 大小和关联性创建冲突驱逐,例如以 4kiB 的倍数写入多行,这些行都映射到 32k / 8-方式 L1d。” 但它没有提供有关如何完成它的任何细节。

4

1 回答 1

0

根据特定的高速缓存设计,只有内存中的某些高速缓存行可以适合高速缓存中的某些高速缓存行组(“集合”)。

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

于 2020-06-25T10:19:10.493 回答