Kürzlich wurde beobachtet, dass zwei Zweige, die denselben Verzweigungsprädiktorzustand im selben Prozess oder sogar prozessübergreifend teilen, bestimmte Seitenkanal-Exploits (Spectre) ermöglichen.
Betrachten wir einen grundlegenden Verzweigungsprädiktor. Es hat 2 ^ 14 Slots und jeder Slot besteht aus zwei Bits (stark genommen, schwach genommen, schwach nicht genommen, stark nicht genommen). Die 14 Indexbits sind die niederwertigen Bits des Verzweigungsbefehls. Somit hat der Verzweigungsprädiktor 2 · 2 · 14 = 32768 Bits oder 4 Kilobyte.
Jetzt gibt es ein Problem: Beim Umschalten zwischen User Space-Prozessen wird der Verzweigungsprädiktorstatus nicht gelöscht. Dies kann durch Hinzufügen eines Verzweigungsprädiktor-Flush-Befehls behoben werden, der beim Ausführen von Kontextwechseln aktiv verwendet wird.
Es gibt noch ein anderes Problem: Zwei Zweige im selben Prozessadressraum können denselben Steckplatz gemeinsam nutzen. Wenn einer dieser Zweige nicht vertrauenswürdiger JIT-Code ist und der andere auf einem Bit eines geheimen Passworts verzweigt, sind wir in Schwierigkeiten. Dies könnte vermutlich durch Löschen des Verzweigungsprädiktorstatus behoben werden, bevor nicht vertrauenswürdiger JITed-Code ausgeführt wird. Wenn der Prozess den Verzweigungsprädiktor jedoch zu oft spült, gehen seine Vorteile verloren.
Es gibt jedoch eine allgemeinere Lösung (vorgeschlagen in /security/176678/is-branch-predictor-flush-instruction-a-complete-spectre-fix ): Speichern Sie zusätzlich zu 2 Bit die verbleibende Adressbits als Tag. Bei einer 32-Bit-Architektur wären es 32-14 = 18 Bit, bei einem 48-Bit-Adressraum in einer 64-Bit-Architektur 48-14 = 34 Bit. Dies würde den Verzweigungsprädiktorzustand auf 20 Bits oder 36 Bits anstelle von 2 Bits bringen und seine Größe mit 10 oder 18 multiplizieren.
Ist diese allgemeine Lösung realistisch? Es würde sicherlich mehr Transistoren im Zweigprädiktor erfordern. Aber ist der Verzweigungsprädiktor bereits zu groß oder so klein, dass seine Größe leicht mit dem erforderlichen Faktor multipliziert werden kann? Es könnte auch andere Vorteile geben, wie die Möglichkeit, den Verzweigungsprädiktor einfach 2-Wege-, 4-Wege- oder 8-Wege-Satzassoziativ zu machen, wie dies heutzutage bei CPU-Caches der Fall ist. Vielleicht sind die Vorteile der Satzassoziativität so groß, dass diese Art von allgemeinerer Lösung eingesetzt werden könnte?
PS: Es sollte wirklich einen CPU Microarchitecture Stack Exchange geben. Ich habe über Informationssicherheits-Stapelaustausch, Stapelüberlauf, Informatik-Stapelaustausch und Elektronik-Stapelaustausch nachgedacht und mich entschlossen, hier zu posten.