Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit artikel worden de concepten van GPU Virtual Address (GPUVA) beschreven en hoe ze worden beheerd vanaf WDDM 2.0 (Windows 10).
GPUVA's worden beheerd op logische pagina's van 4 kB of 64 kB op DDI-niveau (Device Driver Interface). Bij gebruik van deze paginaformaten kunnen GPUVA's verwijzen naar:
- Systeemgeheugen, dat altijd wordt toegewezen met een granulariteit van 4 kB.
- Geheugensegmentpagina's, die kunnen worden beheerd met 4 kB of 64 kB.
Het videogeheugenbeheer (VidMm) ondersteunt een vertaalschema voor virtuele adressen met meerdere niveaus, waarbij verschillende niveaus van paginatabellen worden gebruikt om een virtueel adres te vertalen:
- De niveaus worden genummerd van nul. Niveau nul wordt toegewezen aan het bladniveau.
- Vertaling begint met de paginatabel op hoofdniveau.
Wanneer het aantal paginatabelniveaus twee is, kan het formaat van de paginatabel op hoofdniveau worden aangepast voor een proces met een variabele GPUVA-ruimtegrootte. Elk niveau wordt beschreven door de DXGK_PAGE_TABLE_LEVEL_DESC structuur die het stuurprogramma voor kernelmodusweergave (KMD) invult tijdens een DxgkDdiQueryAdapterInfo aanroep. De KMD vult ook de DXGK_GPUMMUCAPS caps-structuur in om de GPUVA-ondersteuning te beschrijven.
Elk proces heeft een eigen GPUVA-ruimte. Voordat een grafische context van een proces kan worden ingesteld voor uitvoering, wordt de DxgkDdiSetRootPageTable-functie van KMD aangeroepen om het adres van de hoofdpaginatabel in te stellen.
De vertaling van het virtuele adres voor het geval van twee paginatabelniveaus wordt weergegeven in het volgende diagram.
De GPUVA heeft DXGK_GPUMMUCAPS::VirtualAddressBitCount bits.
De lage bits [0 - 11] vertegenwoordigen een offset in bytes binnen een pagina.
De volgende DXGK_PAGE_TABLE_LEVEL_DESC::PageTableIndexBitCount bits vertegenwoordigen de index van een paginatabelvermelding in een paginatabel op bladniveau.
Het aantal vermeldingen in een paginatabel is 2DXGK_PAGE_TABLE_LEVEL_DESC::P ageTableIndexBitCount en de grootte van de paginatabel is DXGK_PAGE_TABLE_LEVEL_DESC::PageTableSizeInBytes bytes.
De rest van de bits vertegenwoordigen een index naar een paginatabelvermelding in de hoofdpaginatabel. De hoofdpaginatabel kan worden aangepast voor het vertaalschema op twee niveaus. De DxgkDdiGetRootPageTableSize DDI bepaalt de grootte.
De DXGK_PTE structuur wordt gebruikt via de DDI om een paginatabelvermelding weer te geven. Deze structuur vertegenwoordigt informatie over elke vermelding, die de DirectX-grafische kernel (Dxgkrnl) beheert. Het stuurprogramma gebruikt deze informatie om hardwarespecifieke paginatabelvermeldingen te maken.
Aanmaak van paginatabeltoewijzingen
Paginatabellen worden gemaakt als impliciete toewijzingen en hebben geen stuurprogramma voor de gebruikersmodus (UMD) of een KMD-ingang.
Om een paginatabel toe te wijzen, wijst VidMm een toewijzing van de grootte DXGK_PAGE_TABLE_LEVEL_DESC::PageTableSizeInBytes uit het segment toe, opgegeven in DXGK_PAGE_TABLE_LEVEL_DESC::PageTableSegmentId. Na de creatie initialiseert
VidMm ondersteunt het wijzigen van de grootte van de hoofdpaginatabel in het vertaalschema op twee niveaus. Wanneer een hoofdpaginatabel met een opgegeven hoeveelheid adresruimte wordt gemaakt, wordt VidMm aangeroepen DxgkDdiGetRootPageTableSize om de vereiste toewijzingsgrootte voor deze tabel te bepalen. VidMm wijst vervolgens in het segment een toewijzing van die grootte toe, zoals opgegeven door DXGK_PAGE_TABLE_LEVEL_DESC::PageTableSegmentId voor het hoofdniveau. Na het maken initialiseert VidMm elke vermelding in de paginatabel tot ongeldig met behulp van de nieuwe UpdatePageTable pagineringsbewerking. De hoofdpaginatabel kan groeien of verkleinen naarmate de hoeveelheid videoadresruimte die een proces nodig heeft, wordt uitgebreid en verkleind. Zodra de hoofdpaginatabel is gemaakt, VidMm roept DxgkDdiSetRootPageTable- aan om de zojuist gemaakte hoofdpaginatabel te koppelen aan de verschillende contexten die binnen worden uitgevoerd.
In gekoppelde weergaveadapterconfiguraties worden hoofdpaginatabellen gemaakt als LinkMirrored toewijzingen. Deze toewijzingen hebben identieke inhoud en bevinden zich op hetzelfde fysieke adres op elke GPU in de koppeling. Paginatabellen op lager niveau worden toegewezen als LinkInstanced toewijzing om aan te geven dat hun inhoud kan variëren tussen GPU's, meestal vanwege verschillende peer mapping. De inhoud van paginatabellen wordt afzonderlijk bijgewerkt op alle GPU's.
Een hoofdpaginatabel vergroten en verkleinen
Deze sectie is alleen van toepassing op systemen met twee paginatabellen. Wanneer het aantal paginatabelniveaus groter is dan twee, wordt de grootte van de paginatabel voor elk niveau gedefinieerd door de virtuele adresseringslimieten en is deze vast.
Wanneer de UMD GPUVA's aanvraagt, vergroot VidMm de adresruimte van een proces om aan de aanvraag te voldoen. Dit doet u door de grootte van de huidige hoofdpaginatabel te vergroten (indien nodig) en nieuwe paginatabellen toe te wijzen voor het nieuwe bereik.
Om een hoofdpaginatabel uit te breiden, creëert VidMm een andere hoofdpaginatabeltoewijzing, maakt deze resident, initialiseert de vermeldingen en vernietigt de oude toewijzing. De functie DxgkDdiGetRootPageTableSize wordt gebruikt om de grootte van de nieuwe paginatabel in bytes op te halen.
Als u een hoofdpaginatabel wilt verkleinen, maakt VidMm een nieuwe toewijzing van een paginatabel, maakt u de tabel resident, kopieert u een deel van de oude paginatabel naar de nieuwe tabel en vernietigt u de oude toewijzing.
Nadat de formaatwijziging is voltooid, roept VidMmDxgkDdiSetRootPageTable- aan om de betrokken contexten te koppelen aan de nieuwe hoofdpaginatabel.
Paginatabel bijwerken
Naarmate de oppervlakken in het geheugen bewegen, werkt VidMm de inhoud van paginatabellen bij zodat deze overeenkomen met de nieuwe locatie van oppervlakken.
Een paginatabel verplaatsen
* VidMm- kan paginatabellen verplaatsen of verwijderen wanneer een apparaat niet actief of onderbroken is. Wanneer VidMm een paginatabel verplaatst, worden de paginatabellen op hogere niveaus bijgewerkt om naar de nieuwe locatie van de paginatabel te verwijzen.
Wanneer de hoofdpaginatabel zelf wordt verplaatst, roept VidMmDxgkDdiSetRootPageTable aan om de betrokken contexten te informeren over de nieuwe locatie van hun paginadirectory.
Fysiek paginaformaat
Zoals eerder vermeld, ondersteunt VidMm twee paginaformaten. Systeemgeheugen wordt altijd beheerd op pagina's van 4 kB, terwijl geheugensegmenten kunnen worden beheerd met een granulariteit van 4 kB of 64 kB, zoals bepaald door de KMD.
Wanneer u kiest voor virtueel geheugenbeheer met pagina's van 64 kB, worden alle toewijzingen automatisch uitgelijnd en krijgen ze een grootte die een veelvoud is van 64 kB.
Het uitbreiden van alle toewijzingen tot 64 KB kan een betekenisvolle impact hebben op het geheugen. UMD is verantwoordelijk voor het verpakken van kleine toewijzingen in een grotere om geheugenverspilling te voorkomen.
Wanneer VidMm een GPUVA toewijst aan een groot geheugensegment van 64 kB, wijst het 4-kB paginatabelvermeldingen toe aan 16 aaneengesloten 4-kB pagina's in het geheugensegment. Zowel het virtuele adres als het fysieke adres hebben gegarandeerd dezelfde uitlijning van 64 kB. Dat wil gezegd: de onderste 16 bits van het virtuele adres en het fysieke adres komen gegarandeerd overeen.