Scenari di esempio di GpuMmu

In questo argomento vengono descritti gli scenari di utilizzo comuni e la sequenza di operazioni necessarie per implementarle.

Aggiornamento delle voci della tabella di pagina di un processo

Ecco la sequenza di operazioni per aggiornare le voci della tabella di pagine per eseguire il mapping di un'allocazione che appartiene a un processo (P) alla memoria fisica. Si presume che le allocazioni della tabella di pagina siano già residenti in un segmento di memoria della GPU (Graphics Processing Unit).

  1. Il gestore della memoria video alloca un intervallo di indirizzi virtuali nel contesto del processo di paging per l'allocazione della tabella delle pagine principale del processo P.
  2. Il gestore della memoria video alloca un intervallo di indirizzi virtuali nel contesto del processo di paging per le allocazioni della tabella di pagine del processo P.
  3. Il gestore della memoria video chiama DxgkDdiBuildPagingBuffer con il comando UpdatePageTable per eseguire il mapping delle voci della tabella delle pagine del processo di paging alle tabelle di pagina P del processo e alla directory della pagina.
  4. La gestione della memoria video chiama DxgkDdiBuildPagingBuffer con il comando FlushTLB(PagingProcessRootPageTable).
  5. Il gestore della memoria video chiama DxgkDdiBuildPagingBuffer con il comando UpdatePageTable per riempire le voci della tabella della pagina del processo con informazioni sull'indirizzo fisico.
  6. La gestione della memoria video chiama DxgkDdiBuildPagingBuffer con il comando FlushTLB(process P root page table).
  7. Il buffer di paging viene inviato per l'esecuzione nel contesto del processo di paging.

Diagramma che mostra la sequenza di operazioni per l'aggiornamento delle voci della tabella di pagine di un processo.

Trasferimento del contenuto di allocazione da una posizione a un'altra

Ecco la sequenza di operazioni durante il trasferimento di un contenuto di allocazione da una posizione a un'altra ,ad esempio dalla memoria locale alla memoria di sistema.

  1. Il gestore della memoria video alloca intervalli di indirizzi virtuali per l'allocazione della sorgente e della destinazione nell'area scratch dell'indirizzo virtuale del processo di paging.
  2. La gestione della memoria video chiama DxgkDdiBuildPagingBuffer con il comando UpdatePageTable . Il comando esegue il mapping delle voci della tabella della pagina del processo di paging per l'intervallo di indirizzi virtuali di origine all'indirizzo fisico di allocazione nella memoria GPU locale.
  3. La gestione della memoria video chiama DxgkDdiBuildPagingBuffer con il comando UpdatePageTable . Il comando mappa le voci della tabella delle pagine del processo di paging all'indirizzo virtuale di destinazione nella memoria di sistema.
  4. La gestione della memoria video chiama DxgkDdiBuildPagingBuffer con FlushTLB (tabella della pagina radice del processo di paging).
  5. La gestione della memoria video chiama DxgkDdiBuildPagingBuffer con il comando TransferVirtual per eseguire un'operazione di trasferimento.
  6. Il buffer di paging viene inviato alla GPU per l'esecuzione nel contesto del processo di paging.

Diagramma che mostra la sequenza di operazioni per il trasferimento del contenuto di allocazione da una posizione a un'altra.

Riempimento di un'allocazione con un modello

Ecco la sequenza di operazioni quando un'allocazione deve essere riempita con un modello.

  1. Il gestore della memoria video alloca un intervallo di indirizzi virtuali per l'allocazione della destinazione nell'area scratch degli indirizzi virtuali del processo di paging.
  2. La gestione della memoria video chiama DxgkDdiBuildPagingBuffer con il comando UpdatePageTable . Il comando esegue il mapping delle voci della tabella della pagina del processo di paging per l'indirizzo virtuale di destinazione.
  3. La gestione della memoria video chiama DxgkDdiBuildPagingBuffer con il comando FlushTLB(tabella della pagina radice del processo di paging).
  4. La gestione della memoria video chiama DxgkDdiBuildPagingBuffer con il comando FillVirtual per eseguire l'operazione.
  5. Il buffer di paging viene inviato alla GPU per l'esecuzione nel contesto del processo di paging.

Diagramma che mostra la sequenza di operazioni per riempire un'allocazione con un modello.

Creazione di un'allocazione residente nella memoria di sistema

Le seguenti operazioni vengono eseguite quando viene chiamato D3DKMTMakeResident per rendere residente un'allocazione di memoria. Si presuppone che le tabelle di pagine del processo dell'applicazione si trovino in memoria.

Nel contesto del thread dell'applicazione:

  1. Allocare e fissare le pagine di memoria fisica del sistema per l'intervallo di indirizzi virtuali di allocazione (se l'allocazione risiede nella memoria di sistema).
  2. Generare un nuovo ID limite di paging per il dispositivo applicazione.
  3. Inviare un comando MakeResident al thread di gestione della memoria video.
  4. Tornare all'applicazione.

Nel contesto del thread di lavoro del gestore della memoria video:

  1. Aggiornare le voci della tabella della pagina del processo dell'applicazione (vedere la sezione corrispondente sopra).
  2. Se l'allocazione si trova in un segmento di memoria locale, compilare l'allocazione con zeri (vedere la sezione corrispondente sopra).
  3. Invia il comando SignalSynchronizationObject al scheduler con l'ID del recinto di paging.

Inizializzazione delle strutture di controllo del gestore della memoria

Inizializzazione del processo di paging

Il kernel della grafica DirectX inizializza lo spazio degli indirizzi virtuali del processo di paging quando il dispositivo grafico passa allo stato del dispositivo di alimentazione D0

  1. Il processo di paging viene creato con DxgkDdiCreateProcess.
  2. Il dispositivo di sistema viene creato con DxgkDdiCreateDevice. A questo punto il driver in modalità kernel può riservare un intervallo di indirizzi virtuali nello spazio di indirizzi del processo di paging.
  3. Le allocazioni delle tabelle di pagine vengono create per il processo di paging.
  4. Le allocazioni delle tabelle di pagine vengono assegnate ai segmenti di memoria definiti nella struttura della capacità di indirizzamento virtuale.
  5. Le operazioni UpdatePageTable vengono chiamate per inizializzare le tabelle di pagine.

Inizializzazione di un processo client

Quando viene creato un nuovo processo, il kernel grafico DirectX:

  • Creare le allocazioni della tabella di pagina iniziale.
  • Inizializzare le allocazioni della tabella di pagine quando la prima allocazione del processo viene resa residente.