Studying hardware prefetchers using cache side channels
Guillaume Didier · 2023
Étude de prefetchers matériels par canal auxiliaire sur le cache Caches contribuent de façon majeure à la performance des processeurs modernes. Pour réduire le nombre d'accès manquant le cache (cache miss), les fabricants incluent des prefetchers ou, en français, préchargeurs, qui visent à anticiper les requêtes mémoires du processeur. Toutefois, les fabricants ne documentent guère ces préchargeurs, d'où l'intérêt d'en faire la rétro-ingénierie. Ceci intéresse les chercheurs en sécurité autant que la communauté haute performance. Néanmoins, cette rétro-ingénierie est rendue difficile parce que les préchargeurs opèrent sur le cache et sont entrainés par les accès mémoires, moyen principal de mesurer l'état du cache. L'observateur interfère alors avec l'expérience. Pour éviter cela, nous avons cherché à employer un autre canal auxiliaire, Flush+Flush, qui utilise l'instruction clflush. Cette instruction n'est pas un accès mémoire, et n'influence donc pas les préchargeurs. Toutefois, une importante variabilité et un fort bruit nuisent grandement à cette primitive sur les processeurs modernes. Notre première contribution a été d'identifier la source du bruit et de la variabilité comme provenant du réseau d'interconnexion entre les coeurs. Nous avons identifié sa topologie et modélisé les temps d'exécution de clflush, ce qui nous a permis de concevoir un algorithme de calibration qui rend Flush+Flush aussi précise que Flush+Reload. Cette primitive améliorée a rendu notre stratégie originale viable, et nous avons alors atteint notre deuxième contribution. Nous avons développé un outil, CacheObserver, écrit en Rust, qui utilise Flush+Flush pour surveiller l'état du cache dans une région de la mémoire, en réaction a une séquence d'accès mémoires. À l'aide de celui-ci, nous avons mis à jour des comportements jusque-là ignorés du L2 Stream prefetcher des processeurs Intel Whiskey et Coffee Lake. Nous avons aussi montré que ce préchargeur interagit avec l’autre préchargeur de niveau 2 de ces processeurs, le Adjacent Cache Line Prefetcher, préchargeur de ligne de cache adjacente.