Dela via


Allokeringsmeddelande

Viktigt!

Viss information gäller en förhandsversionsprodukt som kan ändras avsevärt innan den släpps kommersiellt. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, med avseende på den information som tillhandahålls här.

Det finns tillfällen då vissa åtgärder måste utföras på en allokering som håller på att genomgå en sidväxling eller uppgradering. En allokering kan till exempel komprimeras när den är under enhetsåtkomst. När den allokeringen stängs av (dvs. inte längre tillgänglig för enheten) måste drivrutinen i kernelläge (KMD) först dekomprimera den innan den faktiska utrymmningen. Den DXGK_OPERATION_NOTIFY_ALLOC sidutbytesoperation är utformad för detta ändamål. Den här åtgärden är tillgänglig från och med Windows 11 version 24H2 (WDDM 3.2).

Så här begär du allokeringsmeddelanden

När systemet anropar DxgkDdiCreateAllocation för att skapa en allokering kan KMD ange flaggor i DXGK_ALLOCATIONINFOFLAGS2 för att instruera Dxgkrnl att utföra DXGK_OPERATION_NOTIFY_ALLOC pagingoperation. De aktuella meddelandeflaggorna är:

  • NotifyEviction
  • NotifyIoMmuUnmap

DDI-ändringar

DXGK_OPERATION_NOTIFY_ALLOC paging-operation har lagts till

Flaggor som lagts till i DXGK_ALLOCATIONINFOFLAGS2

Följande flaggor läggs till i DXGK_ALLOCATIONINFOFLAGS2.

  • NotifyEviction

    KMD sätter NotifyEviction-flaggan i sin implementering av DxgkDdiCreateAllocation. Den här flaggan anger att Dxgkrnl ska utfärda en DXGK_OPERATION_NOTIFY_ALLOC NotifyEviction-åtgärd till drivrutinen innan en allokering avlägsnas.

    När flaggan har angetts och allokeringen håller på att tas bort:

    • Dxgkrnl mappar allokeringen till växlingsprocessens virtuella GPU-adressutrymme (VA).
    • Dxgkrnl anropar DxgkDdiBuildPagingBuffer med DXGK_OPERATION_NOTIFY_ALLOC-åtgärden och flaggan NotifyEviction .
    • Drivrutinen skapar kommandon i DMA-bufferten för sidor.
    • DMA-bufferten för paging skickas för körning i systemets kontext.
    • Dxgkrnl avmappar allokeringen från växlingsprocessens GPU VA-utrymme.

    De här stegen kan köras flera gånger om allokeringsstorleken överstiger storleken på minneshanteringsprocessens GPU VA-utrymme.

    Dxgkrnl skickar meddelandet till drivrutinen endast när en allokering avlägsnas från ett bländarsegment eller från det implicita systemminnessegmentet.

  • NotifyIoMmuUnmap

    KMD ställer in flagga NotifyIoMmuUnmap i dess DxgkDdiCreateAllocation-funktion. Den här flaggan anger att Dxgkrnl ska utfärda en DXGK_OPERATION_NOTIFY_ALLOC NotifyIoMmuUnmap-åtgärd innan du avmappar allokeringen från IOMMU. Drivrutinen har möjlighet att rensa interna cacheminnen. Drivrutinen ska säkerställa att GPU:ns tilldelade virtuella adress (VA) inte nås efter återgång från växlingsoperationen.

    När flaggan har angetts och allokeringen håller på att avmappas från IOMMU under borttagningen:

    • Dxgkrnl anropar DxgkDdiBuildPagingBuffer med åtgärden DXGK_OPERATION_NOTIFY_ALLOC och flaggan NotifyIoMmuUnmap .
    • Drivrutinen skapar kommandon i DMA-bufferten för sidindelning.
    • DMA-bufferten för sidindelning skickas för körning i systemkontexten.
    • Dxgkrnl väntar på att alla växlingsåtgärder ska slutföras.
    • Allokeringen kopplas bort från IOMMU.

    Meddelandet skickas endast när enheten stöder virtuella adresseringsmodeller för GpuVaIoMmu eller GpuVaIoMmuGlobal.

Storlek på GPU VA-utrymme för minnessidoringsprocess

För att få storleken på växlingsprocessens GPU VA-utrymme läggs DXGKQAITYPE_PAGINGPROCESSGPUVASIZE till i DXGK_QUERYADAPTERINFOTYPE uppräkning.

Åtgärden DXGK_OPERATION_NOTIFY_ALLOC NotifyEviction kräver att motsvarande allokering mappas till sidbytesprocessens GPU VA-utrymme. Dxgkrnl allokerar GPU VA-utrymmet för systemets växlingsprocess endast när det finns ett lokalt minnessegment eller när maskinvaruschemaläggning är aktiverad. Storleken på GPU VA-utrymmet är en fjärdedel av det största lokala minnessegmentet eller storleken på loggbuffertarna för maskinvaruschemaläggning, beroende på vilket som är störst. Den resulterande GPU VA-storleken kan vara liten för att mappa en fullständig allokering. I det här fallet måste drivrutinen ange storleken på personsökningens GPU VA-utrymme.

Dxgkrnl anropar DxgkDdiQueryAdapterInfo med en DXGKARG_QUERYADAPTERINFO struktur på följande sätt för att fastställa storleken på växlingsprocessens GPU VA-utrymme:

  • Typ är inställd på DXGKQAITYPE_PAGINGPROCESSGPUVASIZE.
  • pInputData pekar på ett UINT-värde som anger det fysiska adapterindexet i en LDA-konfiguration. Dxgkrnl anger det till noll för icke-LDA-konfigurationer.
  • InputDataDataSize är sizeof(UINT).
  • pOutputData pekar på ett UINT-värde där drivrutinen returnerar storleken på växlingsprocessens GPU VA-utrymme i megabyte.
  • OutputDataSize är sizeof(UINT).

Om drivrutinen misslyckas med anropet eller returnerar ett pOutputData-värde på noll, avgör operativsystemet växlingsprocessens GPU VA-storlek.

Om en adapter har ett stort lokalt minnessegment ska drivrutinen returnera noll så att operativsystemet kan välja storleken på sidhanteringsprocessens GPU VA-utrymme. Ju större VA-utrymme desto mer minne behövs för växlingsprocessens GPU-sidtabeller. Sidtabellerna är alltid laddade, så drivrutinen bör inte ange en onödigt stor storlek för VA-utrymmet.

Växlingsåtgärder (fyllning, överföring, meddelandeallokering) utförs i segment när en allokeringsstorlek överskrider växlingsprocessens GPU VA-utrymmesstorlek.