Ich habe kürzlich von dem Angriff Row Hammer erfahren. Um diesen Angriff auszuführen, muss der Programmierer die komplette Cache-Hierarchie einer CPU für eine bestimmte Anzahl von Adressen löschen.
Meine Frage ist: Warum ist CLFLUSH in x86 notwendig? Was sind die Gründe für die Verwendung dieser Anweisung, wenn alle L * -Caches transparent agieren (d. H. Keine explizite Cache-Invalidierung erforderlich ist)? Abgesehen davon: Ist die CPU nicht frei, Speicherzugriffsmuster zu spekulieren und dadurch den Befehl insgesamt zu ignorieren?
Meistens für seltsame Sachen wie cachefähige MMIO-Regionen, denke ich.
Skylake hat CLFLUSHOPT mit einer schwach geordneten höheren Performance eingeführt, da es für nichtflüchtige Speicher nützlich ist, die direkt mit der Speicherhierarchie verbunden sind. Der Lösch-Cache stellt sicher, dass Daten in den tatsächlichen Speicher geschrieben werden und nicht immer noch in der CPU verschmutzt sind.
Es spielt möglicherweise auch für nicht-cache-kohärente DMA zu Geräten eine Rolle, wenn irgendetwas noch in x86 das tun kann. (Wahrscheinlich nicht; ich denke, alle DMA sind jetzt cache-kohärent.)
Ich bin diesbezüglich kein Experte, und das soll keine vollständige Antwort auf alle Anwendungsfälle sein.
Tags und Links assembly x86 caching cpu-architecture cache-invalidation