Freigeben über


System-Paging-Prozess

Die meisten Auslagerungsvorgänge erfolgen im Kontext des Systemauslagerungsprozesses. Die einzige Ausnahme ist die Aktualisierung der Seitentabelle aus dem UpdateGpuVirtualAddress-Rückruf, der in einem speziellen Begleitkontext auftritt und synchron zum Rendern auftritt.

Der DirectX-Grafikkern verwendet den System paging-Prozess, um Pagingvorgänge auszuführen, z. B.:

  • Übertragungszuordnung zwischen Speicher des System- und des lokalen Grafikprozessors (GPU)
  • Zuweisungen mit Mustern füllen
  • Aktualisieren von Seitentabellen
  • Zuordnungen zum Blendensegment
  • Leeren des Übersetzungs-Look-Aside-Puffers

Der Pagingprozess verfügt über einen eigenen virtuellen GPU-Adressraum, GPU-Kontexte und Direct Memory Access-Puffer (DMA-Puffer), die als Pagingpuffer bezeichnet werden. Es verfügt über eigene Seitentabellen, die im physischen Speicher angeheftet sind und nur bei Stromübergängen entfernt werden.

Der virtuelle Adressraum für den Pagingprozess verfügt über ein vordefiniertes Layout, wird während der Adapterinitialisierung initialisiert, und jedes Mal, wenn der Speicherinhalt aufgrund von Stromübergängen verloren geht.

Diagramm, das die Beziehung zwischen virtuellen und physischen Adressräumen im System paging-Prozess zeigt.

Der DirectX-Grafik-Kernel initialisiert genügend Seitentabellen und Seitentabelleneinträge in der Stammseitentabelle, um den virtuellen Adressraum von 1 GB abzudecken. Der Zwischenspeicherbereich wird verwendet, um temporäre Zuordnungen während Transfer- und Befüllvorgänge im virtuellen Adressraum des Pagingprozesses abzubilden. Wenn eine Zuordnung nicht in den Zwischenspeicherbereich für virtuelle Adressen passt, erfolgt der Übertragungsvorgang in Blöcken.

Für den Pagingprozess wird eine Systemstammseitentabellenzuordnung erstellt. Der Inhalt wird während der Initialisierung festgelegt und ändert sich nie (außer nach Stromübergängen).

Die Seitentabellen des Systemprozesses sind in zwei Teile unterteilt:

Es wird eine Systemseitentabelle erstellt, die die Entwurfsbereichsseitentabelle in den Adressraum des Systemprozesses widerspiegelt. Auf diese Weise kann der Systemprozess die Seitentabellen des Scratch-Bereichs ändern und Speicher bei Bedarf dem Scratch-Bereich zuordnen oder daraus aufheben. Der Inhalt der Seitentabellen wird während der Adapterinitialisierung festgelegt und ändert sich nie. Die Seitentabelleneinträge der Scratch-Bereich Seitentabelle werden verwendet, um Zuordnungen dem virtuellen Adressraum des Pagingprozesses zuzuordnen. Sie werden während der Initialisierung als ungültig initialisiert und später für Pagingvorgänge verwendet. Die Seitentabellen des Pagingprozesses werden während der Adapterinitialisierung und des Einschaltvorgangs über Pagingvorgänge mit UpdatePageTable initialisiert. Für diese Vorgänge wird der PageTableUpdateMode auf CPU_VIRTUAL erzwungen und muss unmittelbar mit der CPU abgeschlossen werden (der Seitentabellenpuffer sollte nicht verwendet werden).

Aktualisierungen der Seitentabelleneinträge für alle anderen Prozesse werden mithilfe des vom Treiber angegebenen PageTableUpdateMode durchgeführt. Diese Updates werden im Kontext des Pagingprozesses durchgeführt.

Hier erfahren Sie, wie das Setup durchgeführt wird:

  1. Eine Stammseitentabellenzuordnung und Tabellenzuordnungen auf niedrigerer Ebene werden erstellt, um 1 GB Adressraum abzudecken.
  2. Die Allokationen sind einem Speichersegment zugewiesen.
  3. Mehrere UpdatePageTable-Pagingvorgänge werden an den Treiber ausgegeben, um die Seitentabelleneinträge zu initialisieren.

Als Beispiel für die Initialisierung des virtuellen Adressraums des Pagingprozesses betrachten wir den Fall mit den folgenden Parametern:

  • Die Seitengröße beträgt 4096 Byte.
  • Der virtuelle Adressraum des Pagingprozesses beträgt 1 GB.
  • Seitentabelleneintragsgröße beträgt 4 Byte

In diesem Fall benötigen wir ein zweistufiges Übersetzungsschema bestehend aus:

  • Eine Systemstammseitentabelle
  • Eine Systemseitentabelle
  • 255 temporäre Speicherseitentabellen

Die folgende Abbildung zeigt, wie die Seitentabellen basierend auf der Position der Stammseitentabelle und der Seitentabelle im physischen Speicher initialisiert werden. Beachten Sie, dass die physischen Adressen nur als Abbildung angegeben werden. Eine Seitentabelle umfasst 4 MB des Adressraums. Die Seitentabelle des Systems deckt alle Seitentabellen des Scratch-Bereichs ab. Der Scratch-Bereich beginnt ab einer virtuellen Adresse von 4 MB.

Wie Sie sehen, ist der virtuelle Adressbereich von 0 bis 4095 ungültig.

Diagramm, das den Prozess der Seitentabelleninitialisierung in einem 2-Ebenen-Übersetzungsschema veranschaulicht.