Condividi tramite


Notifica di allocazione

Importante

Alcune informazioni riguardano un prodotto in versione preliminare che potrebbe essere modificato in modo sostanziale prima che venga rilasciato commercialmente. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.

In alcuni casi è necessario eseguire determinate operazioni su un'allocazione che sta per essere sottoposta a un'operazione di rimozione o promozione del paging. Ad esempio, un'allocazione potrebbe essere compressa quando è sotto l'accesso al dispositivo. Quando l'allocazione viene rimossa (ovvero non è più sotto l'accesso al dispositivo), il driver in modalità kernel (KMD) deve prima decomprimerlo prima della rimozione effettiva. L'operazione di paging DXGK_OPERATION_NOTIFY_ALLOC è progettata per questo scopo. Questa operazione è disponibile a partire da Windows 11 versione 24H2 (WDDM 3.2).

Come richiedere notifiche di allocazione

Quando il sistema chiama DxgkDdiCreateAllocation per creare un'allocazione, il KMD può impostare flag in DXGK_ALLOCATIONINFOFLAGS2 per indicare a Dxgkrnl di eseguire l'operazione di paging DXGK_OPERATION_NOTIFY_ALLOC. I flag di notifica correnti sono:

  • NotifyEviction
  • NotifyIoMmuUnmap

Modifiche DDI

DXGK_OPERATION_NOTIFY_ALLOC'operazione di paging aggiunta

Flag aggiunti a DXGK_ALLOCATIONINFOFLAGS2

I flag seguenti vengono aggiunti a DXGK_ALLOCATIONINFOFLAGS2.

  • NotifyEviction

    Il KMD imposta il flag NotifyEviction nell'implementazione dxgkDdiCreateAllocation . Questo flag indica che Dxgkrnl deve eseguire un'operazione di DXGK_OPERATION_NOTIFY_ALLOC NotifyEviction al driver prima di rimuovere un'allocazione.

    Quando viene specificato il flag e l'allocazione sta per essere rimossa:

    • Dxgkrnl esegue il mapping dell'allocazione allo spazio di indirizzi virtuali (VA) del processo di paging.
    • Dxgkrnl chiama DxgkDdiBuildPagingBuffer con l'operazione di DXGK_OPERATION_NOTIFY_ALLOC e il flag NotifyEviction.
    • Il driver compila i comandi nel buffer DMA di paging.
    • Il buffer DMA di paging viene inviato per l'esecuzione nel contesto di sistema.
    • Dxgkrnl annulla il mapping dell'allocazione dallo spazio va GPU del processo di paging.

    Questi passaggi possono essere eseguiti più volte se le dimensioni dell'allocazione sono maggiori delle dimensioni dello spazio va gpu del processo di paging.

    Dxgkrnl invia la notifica al driver solo quando un'allocazione viene rimossa da un segmento di apertura o dal segmento di memoria di sistema implicito.

  • NotifyIoMmuUnmap

    KMD imposta il flag NotifyIoMmuUnmap nella funzione DxgkDdiCreateAllocation. Questo flag indica che Dxgkrnl deve eseguire un'operazione DXGK_OPERATION_NOTIFY_ALLOC NotifyIoMmuUnmap prima di annullare il mapping dell'allocazione da IOMMU. Il driver ha la possibilità di cancellare le cache interne. Il driver deve assicurarsi che l'allocazione gpu va non sia accessibile dopo la restituzione dall'operazione di paging.

    Quando viene specificato il flag e l'allocazione sta per essere annullata da IOMMU durante la rimozione:

    • Dxgkrnl chiama DxgkDdiBuildPagingBuffer con l'operazione di DXGK_OPERATION_NOTIFY_ALLOC e il flag NotifyIoMmuUnmap.
    • Il driver compila i comandi nel buffer DMA di paging.
    • Il buffer DMA di paging viene inviato per l'esecuzione nel contesto di sistema.
    • Dxgkrnl attende il completamento di tutte le operazioni di paging.
    • L'allocazione non è mappata dall'IOMMU.

    La notifica viene inviata solo quando il dispositivo supporta i modelli di indirizzamento virtuale GpuVaIoMmu o GpuVaIoMmuGlobal.

Dimensioni dello spazio va della GPU del processo di paging

Per ottenere le dimensioni dello spazio va GPU del processo di paging, DXGKQAITYPE_PAGINGPROCESSGPUVASIZE viene aggiunto all'enumerazione DXGK_QUERYADAPTERINFOTYPE.

L'operazione di DXGK_OPERATION_NOTIFY_ALLOC NotifyEviction richiede che l'allocazione corrispondente venga mappata allo spazio DI valutazione della GPU del processo di paging. Dxgkrnl alloca lo spazio VA GPU per il processo di paging (sistema) solo quando è presente un segmento di memoria locale o quando è abilitata la pianificazione hardware. Le dimensioni dello spazio va GPU sono un quarto del segmento di memoria locale più grande o le dimensioni dei buffer di log di pianificazione hardware, a seconda di quale sia maggiore. Le dimensioni di valutazione della GPU risultanti potrebbero essere ridotte per eseguire il mapping di un'allocazione completa. In questo caso, il driver deve specificare le dimensioni dello spazio VA della GPU del processo di paging.

Dxgkrnl chiama DxgkDdiQueryAdapterInfo con una struttura di DXGKARG_QUERYADAPTERINFO come indicato di seguito per ottenere le dimensioni dello spazio VA DELLA GPU del processo di paging:

  • Il tipo è impostato DXGKQAITYPE_PAGINGPROCESSGPUVASIZE.
  • pInputData punta a un valore UINT che specifica l'indice dell'adattatore fisico in una configurazione LDA. Dxgkrnl lo imposta su zero per le configurazioni non LDA.
  • InputDataDataSize è sizeof(UINT).
  • pOutputData punta a un valore UINT in cui il driver restituisce le dimensioni dello spazio VA GPU del processo di paging in megabyte.
  • OutputDataSize è sizeof(UINT).

Se il driver non riesce la chiamata o restituisce un valore pOutputData pari a zero, il sistema operativo determina le dimensioni del processo di paging della GPU VA.

Se un adattatore ha un segmento di memoria locale di grandi dimensioni, il driver deve restituire zero per consentire al sistema operativo di scegliere le dimensioni dello spazio di paging del processo di paging della GPU. Maggiore è lo spazio VA, maggiore è la quantità di memoria necessaria per il paging delle tabelle di pagine GPU del processo. Le tabelle di pagina sono sempre residenti, quindi il driver non deve specificare una dimensione di grandi dimensioni non necessaria per lo spazio VA.

Le operazioni di paging (riempimento, trasferimento, allocazione delle notifiche) vengono eseguite in blocchi quando una dimensione di allocazione supera le dimensioni dello spazio di paging della GPU.