Wenn INVLPG ausgeführt werden soll oder nicht, gehe zu CR3, um die TLB-Leerung zu minimieren.

Prolo

Ich bin ein Betriebssystem-Hobbyist und mein Kernel läuft auf 80486+ und unterstützt bereits virtuellen Speicher.

Ab 80386 unterstützt die x86-Prozessorfamilie von Intel und verschiedene Klone davon den virtuellen Speicher mit Paging. Es ist bekannt, dass, wenn diePG bit inCR0enn @ gesetzt ist, verwendet der Prozessor die virtuelle Adressumsetzung. Dann ist dieCR3 register zeigt auf das Seitenverzeichnis der obersten Ebene, das der Stamm für 2-4 Ebenen von Seitentabellenstrukturen ist, die die virtuellen Adressen physischen Adressen zuordnen.

Der Prozessor durchsucht diese Tabellen nicht für jede generierte virtuelle Adresse, sondern speichert sie in einer Struktur mit dem Namen @ zwischeTranslation Lookaside Buffer oder TLB. Wenn Änderungen an den Seitentabellen vorgenommen werden, muss der TLB jedoch gelöscht werden. Auf 80386-Prozessoren würde diese Leerung durch erneutes Laden MOV) CR3 mit der Verzeichnisadresse der obersten Ebene oder einem Taskwechsel. Dies löscht angeblich bedingungslos alle TLB-Einträge. Soweit ich weiß, wäre es für ein virtuelles Speichersystem vollkommen gültig, CR3 immer neu laden nachirgendei Veränderung

Das ist verschwenderisch, da der TLB jetzt ganz gute Einträge rausschmeißen würde, also bei 80486 Prozessoren dasINVLPG Anweisung wurde eingeführt.INVLPG macht den TLB-Eintrag ungültig, der mit der Adresse des Quelloperanden übereinstimmt.

Noch beginnend mit Pentium Pro haben wir auch globale Seiten, die nicht mit den Verschiebungen nach @ gespült werdeCR3 oder Taskwechsel; und AMD x86-64 ISA sagt, dass einige Seitentabellenstrukturen der oberen Ebene möglicherweise zwischengespeichert und nicht durch @ ungültig gemacht werdeINVLPG. Um ein kohärentes Bild davon zu erhalten, was auf jeder ISA benötigt wird und was nicht, müsste man wirklich ein 1000-seitiges Datenblatt für eine Vielzahl von ISAs herunterladen, die seit den 80er Jahren veröffentlicht wurden, um ein paar Seiten darin zu lesen, und selbst dann scheinen die Dokumente zu sein Seien Sie in Bezug auf die Ungültigmachung des TLB besonders vage. Und was passiert, wenn der TLB nicht ordnungsgemäß ungültig gemacht wird?

Frag

er Einfachheit halber kann man davon ausgehen, dass Wir sprechen über ein Einprozessorsystem. Es kann auch davon ausgegangen werden, dass kein Taskwechsel erforderlich nach Änderung der Seitenstruktur. (alsoINVLPG ist angeblich immer mindestens so gut wie das nachladen desCR3 registrieren)

Die Grundannahme ist, dass man @ neu laden müssCR3 nach jeder Änderung an Seitentabellen und Seitenverzeichnissen, und ein solches System wäre korrekt. Wenn man es jedoch vermeiden möchte, den TLB unnötig zu leeren, braucht man Antworten auf die 2 Fragen:

Unter der Vorraussetzung, dassINVLPG wird auf dem ISA unterstützt. Nach welchen Änderungen kann man es sicher verwenden, anstatt das @ neu zu ladeCR3? Z.B. "Wenn man einen Seitenrahmen ausmappt (den entsprechenden Tabelleneintrag auf nicht vorhanden setzt), kann man immer @ verwendINVLPG "?

Welche Art von Änderungen kann man an den Tabellen und Verzeichnissen vornehmen, ohne @ zu berührCR3 oder Ausführen vonINVLPG? Z.B. "Wenn eine Seite überhaupt nicht zugeordnet ist (nicht vorhanden), kann man einen PTE mit @ schreibePresent=1 dafür, ohne den TLB zu leeren "?

Selbst nach dem Lesen einer ganzen Reihe von ISA-Dokumenten und allem, was mit @ zu tun hINVLPG hier bei Stack Overflow Ich bin mir bei beiden Beispielen, die ich dort vorgestellt habe, nicht sicher. In der Tat, einnotable post sagte es sofort: "Ich weiß nicht genau, wann Sie es verwenden sollen und wann nicht." Daher sind alle bestimmten, korrekten, vorzugsweise dokumentierten Beispiele für IA32 oder x86-64, die Sie angeben können, willkommen.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage