Freigeben über


Zuteilungsbenachrichtigung

Wichtig

Einige Informationen beziehen sich auf Vorabversionen, die vor der kommerziellen Freigabe möglicherweise grundlegend geändert werden können. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.

Es gibt Zeiten, in denen bestimmte Vorgänge für eine Zuordnung durchgeführt werden müssen, die sich einer Paging-Lösch- oder Förderoperation unterziehen muss. Beispielsweise kann eine Zuordnung komprimiert werden, wenn sie sich unter Gerätezugriff befindet. Wenn diese Zuordnung gelöscht wird (d. h. nicht mehr unter Gerätezugriff), muss der Kernel-Mode-Treiber (KMD) sie zuerst dekomprimieren, bevor die tatsächliche Löschung erfolgt. Der DXGK_OPERATION_NOTIFY_ALLOC Paging-Vorgang wurde für diesen Zweck entwickelt. Dieser Vorgang ist ab Windows 11, Version 24H2 (WDDM 3.2) verfügbar.

Anfordern von Zuweisungsbenachrichtigungen

Wenn das System DxgkDdiCreateAllocation aufruft, um eine Zuordnung zu erstellen, kann der Kernelmodustreiber (KMD) Flags in DXGK_ALLOCATIONINFOFLAGS2 setzen, um Dxgkrnl anzuweisen, den Paging-Vorgang DXGK_OPERATION_NOTIFY_ALLOC auszuführen. Die aktuellen Benachrichtigungskennzeichnungen sind:

  • NotifyEviction
  • NotifyIoMmuUnmap

DDI-Änderungen

DXGK_OPERATION_NOTIFY_ALLOC Paging-Vorgang hinzugefügt

Flags, die DXGK_ALLOCATIONINFOFLAGS2 hinzugefügt wurden

Die folgenden Flags werden DXGK_ALLOCATIONINFOFLAGS2 hinzugefügt.

  • NotifyEviction

    Der KMD legt das NotifyEviction-Flag in seiner DxgkDdiCreateAllocation-Implementierung fest. Dieses Flag gibt an, dass Dxgkrnl einen DXGK_OPERATION_NOTIFY_ALLOC NotifyEviction-Vorgang an den Treiber ausstellen sollte, bevor eine Zuordnung aufgehoben wird.

    Wenn das Flag angegeben ist und die Zuordnung zur Aufhebung erfolgt:

    • Dxgkrnl ordnet die Zuordnung dem virtuellen Adressraum (VA) der GPU des Paging-Prozesses zu.
    • Dxgkrnl ruft DxgkDdiBuildPagingBuffer mit dem DXGK_OPERATION_NOTIFY_ALLOC-Vorgang und dem NotifyEviction-Flag auf.
    • Der Treiber erstellt Befehle im Paging-DMA-Puffer.
    • Der Paging-DMA-Puffer wird für die Ausführung im Systemkontext übermittelt.
    • Dxgkrnl hebt die Zuordnung zum GPU-VA-Speicherplatz des Paging-Prozesses auf.

    Diese Schritte können mehrmals ausgeführt werden, wenn die Zuordnungsgröße größer als die Größe des GPU VA-Speicherplatzes des Pagingprozesses ist.

    Dxgkrnl sendet die Benachrichtigung nur dann an den Treiber, wenn eine Zuordnung aus einem Blendensegment oder aus dem impliziten Systemspeichersegment entfernt wird.

  • NotifyIoMmuUnmap

    Der KMD legt das NotifyIoMmuUnmap-Flag in seiner DxgkDdiCreateAllocation-Funktion fest. Dieses Flag gibt an, dass Dxgkrnl einenDXGK_OPERATION_NOTIFY_ALLOC NotifyIoMmuUnmap-Vorgang ausgeben soll, bevor die Zuordnung von IOMMU aufzuheben ist. Der Treiber hat die Möglichkeit, interne Caches zu löschen. Der Treiber sollte sicherstellen, dass nach der Rückkehr vom Paging-Vorgang nicht auf die GPU-VA-Zuordnung zugegriffen wird.

    Wenn das Flag angegeben ist und die Zuordnung von IOMMU während der Entfernung aufgehoben werden soll:

    • Dxgkrnl ruft DxgkDdiBuildPagingBuffer mit dem DXGK_OPERATION_NOTIFY_ALLOC-Vorgang und dem NotifyIoMmuUnmap-Flag auf.
    • Der Treiber erstellt Befehle im Paging-DMA-Puffer.
    • Der Paging-DMA-Puffer wird für die Ausführung im Systemkontext übermittelt.
    • Dxgkrnl wartet auf den Abschluss aller Auslagerungsvorgänge.
    • Die Zuweisung ist von der IOMMU nicht zugeordnet.

    Die Benachrichtigung wird nur gesendet, wenn das Gerät gpuVaIoMmu oder GpuVaIoMmuGlobal virtuelle Adressierungsmodelle unterstützt.

Größe des GPU VA-Speicherplatzes für den Paging-Prozess

Um die Größe des GPU-Speicherplatzes für den Paging-Prozess abzurufen, wird DXGKQAITYPE_PAGINGPROCESSGPUVASIZE der DXGK_QUERYADAPTERINFOTYPE Enumeration hinzugefügt.

Für den DXGK_OPERATION_NOTIFY_ALLOC NotifyEviction-Vorgang muss die entsprechende Zuordnung dem GPU VA-Speicherplatz des Paging-Prozesses zugeordnet werden. Dxgkrnl weist den GPU VA-Speicherplatz nur für den Pagingprozess (System) zu, wenn ein lokales Speichersegment vorhanden ist oder wenn die Hardwareplanung aktiviert ist. Die Größe des GPU VA-Speicherplatzes ist ein Viertel des größten lokalen Speichersegments oder die Größe der Hardwareplanungsprotokollpuffer, je nachdem, welcher Wert größer ist. Die resultierende GPU VA-Größe kann klein sein, um eine vollständige Zuordnung zuzuordnen. In diesem Fall muss der Treiber die Größe des GPU-Speicherplatzes für den Auslagerungsprozess angeben.

Dxgkrnl ruft DxgkDdiQueryAdapterInfo mit einer DXGKARG_QUERYADAPTERINFO Struktur wie folgt auf, um die Größe des GPU VA-Speicherplatzes für den Pagingprozess abzurufen:

  • Typ ist festgelegt auf DXGKQAITYPE_PAGINGPROCESSGPUVASIZE.
  • pInputData verweist auf einen UINT-Wert, der den physischen Adapterindex in einer LDA-Konfiguration angibt. Dxgkrnl legt ihn für Nicht-LDA-Konfigurationen auf Null fest.
  • InputDataDataSize ist sizeof(UINT).
  • pOutputData verweist auf einen UINT-Wert, in dem der Treiber die Größe des GPU VA-Speicherplatzes des Paging-Prozesses in Megabyte zurückgibt.
  • OutputDataSize ist sizeof(UINT).

Wenn der Treiber den Aufruf fehlschlägt oder einen pOutputData-Wert von Null zurückgibt, bestimmt das Betriebssystem die GPU VA-Größe des Paging-Prozesses.

Wenn ein Adapter über ein großes lokales Speichersegment verfügt, sollte der Treiber Null zurückgeben, damit das Betriebssystem die Größe des GPU VA-Speicherplatzes für den Paging-Prozess auswählen kann. Je größer der VA-Speicherplatz, desto mehr Speicher wird für den Paging-Prozess der GPU-Seitentabellen benötigt. Die Seitentabellen sind immer vorhanden, sodass der Treiber keine unnötige große Größe für den VA-Speicherplatz angeben sollte.

Paging-Vorgänge (Füllung, Übertragung, Benachrichtigungszuweisung) werden in Blöcken durchgeführt, wenn eine Zuordnungsgröße die GPU VA-Speicherplatzgröße des Paging-Prozesses überschreitet.