Przykładowe scenariusze GpuMmu

W tym temacie opisano typowe scenariusze użycia i sekwencję operacji niezbędnych do ich zaimplementowania.

Aktualizowanie wpisów tabeli stron procesu

Oto sekwencja operacji aktualizowania wpisów tabeli stron w celu mapowania alokacji należącej do procesu (P) do pamięci fizycznej. Zakłada się, że alokacje tabeli stron znajdują się już w segmencie pamięci jednostki przetwarzania grafiki (GPU).

  1. Menedżer pamięci wideo przydziela wirtualny zakres adresów w kontekście procesu stronicowania dla alokacji tabeli strony głównej procesu P.
  2. Menedżer pamięci wideo przydziela wirtualny zakres adresów w kontekście procesu stronicowania dla alokacji tabeli stron procesu P.
  3. Menedżer pamięci wideo wywołuje DxgkDdiBuildPagingBuffer przy użyciu polecenia UpdatePageTable w celu zamapowania wpisów tabeli stron dla procesu stronicowania do tabel stron procesu P i katalogu stron.
  4. Menedżer pamięci wideo wywołuje polecenie DxgkDdiBuildPagingBuffer za pomocą polecenia FlushTLB(PagingProcessRootPageTable).
  5. Menedżer pamięci wideo wywołuje DxgkDdiBuildPagingBuffer za pomocą polecenia UpdatePageTable, aby wypełnić wpisy tabeli stron procesu informacjami o adresie fizycznym.
  6. Menedżer pamięci wideo wywołuje polecenie DxgkDdiBuildPagingBuffer za pomocą polecenia FlushTLB(przetwarzanie tabeli strony głównej P).
  7. Bufor stronicowania jest przekazywany do wykonania w ramach procesu stronicowania.

Diagram przedstawiający sekwencję operacji aktualizowania wpisów tabeli stron procesu.

Transferowanie zawartości alokacji z jednej lokalizacji do innej

Oto sekwencja operacji podczas przesyłania zawartości alokacji z jednej lokalizacji do innej (np. z pamięci lokalnej do pamięci systemowej).

  1. Menedżer pamięci wideo przydziela wirtualne zakresy adresów dla alokacji źródła i alokacji docelowej w obszarze tymczasowym adresów wirtualnych procesu stronicowania.
  2. Menedżer pamięci wideo wywołuje polecenie DxgkDdiBuildPagingBuffer za pomocą polecenia UpdatePageTable . Polecenie mapuje wpisy tabeli stron dla procesu stronicowania z zakresu źródłowych adresów wirtualnych na fizyczny adres alokacji w lokalnej pamięci GPU.
  3. Menedżer pamięci wideo wywołuje polecenie DxgkDdiBuildPagingBuffer za pomocą polecenia UpdatePageTable . Polecenie mapuje wpisy tabeli stron procesu stronicowania dla docelowego adresu wirtualnego do pamięci systemowej.
  4. Menedżer pamięci wideo wywołuje DxgkDdiBuildPagingBuffer z FlushTLB(tabeli stron głównych procesu stronicowania).
  5. Menedżer pamięci wideo wywołuje DxgkDdiBuildPagingBuffer za pomocą polecenia TransferVirtual w celu wykonania operacji transferu.
  6. Bufor stronicowania jest przesyłany do procesora GPU w celu wykonania w kontekście procesu stronicowania.

Diagram przedstawiający sekwencję operacji przenoszenia zawartości alokacji z jednej lokalizacji do innej.

Wypełnianie alokacji wzorcem

Oto sekwencja operacji, gdy alokacja musi być wypełniona wzorcem.

  1. Menedżer pamięci wideo przydziela wirtualny zakres adresów dla alokacji docelowej w obszarze tymczasowym adresu wirtualnego procesu stronicowania.
  2. Menedżer pamięci wideo wywołuje polecenie DxgkDdiBuildPagingBuffer za pomocą polecenia UpdatePageTable . Polecenie mapuje wpisy tabeli stron procesu stronicowania dla docelowego adresu wirtualnego.
  3. Menedżer pamięci wideo wywołuje DxgkDdiBuildPagingBuffer z FlushTLB(główna tabela stron procesu stronicowania).
  4. Menedżer pamięci wideo wywołuje DxgkDdiBuildPagingBuffer za pomocą polecenia FillVirtual w celu wykonania operacji.
  5. Bufor stronicowania jest przekazywany do GPU do wykonania w kontekście procesu stronicowania.

Diagram przedstawiający sekwencję operacji wypełniania alokacji wzorcem.

Umieszczanie alokacji w pamięci systemowej jako rezydenta

Następujące operacje są wykonywane, gdy D3DKMTMakeResident jest wywoływany w celu utworzenia rezydenta alokacji. Zakłada się, że tabele stron procesu aplikacji znajdują się w pamięci.

W kontekście wątku aplikacji:

  1. Przydziel i przypnij strony pamięci systemu fizycznego dla zakresu adresów wirtualnych alokacji (jeśli alokacja znajduje się w pamięci systemowej).
  2. Wygeneruj nowy identyfikator synchronizacji stronicowania dla urządzenia związane z aplikacją.
  3. Prześlij polecenie MakeResident do roboczego wątku menedżera pamięci graficznej.
  4. Wróć do aplikacji.

W kontekście działania wątku roboczego zarządzania pamięcią wideo:

  1. Zaktualizuj wpisy tabeli stron procesu aplikacji (zobacz odpowiednią sekcję powyżej).
  2. Jeśli alokacja znajduje się w lokalnym segmencie pamięci, wypełnij alokację zerami (zobacz odpowiednią sekcję powyżej).
  3. Prześlij polecenie SignalSynchronizationObject do harmonogramu z użyciem identyfikatora przegrody stronicowania.

Inicjowanie struktur sterowania menedżera pamięci

Inicjowanie procesu stronicowania

Jądro grafiki DirectX inicjuje wirtualną przestrzeń adresową procesu stronicowania, gdy urządzenie graficzne jest przełączane do stanu urządzenia zasilania D0

  1. Proces stronicowania jest tworzony za pomocą polecenia DxgkDdiCreateProcess.
  2. Urządzenie systemowe jest tworzone za pomocą polecenia DxgkDdiCreateDevice. W tym momencie sterownik trybu jądra może zarezerwować wirtualny zakres adresów w przestrzeni adresowej procesu stronicowania.
  3. Alokacje tabeli stron są tworzone dla procesu stronicowania.
  4. Alokacje tabeli stron są zatwierdzane w segmentach pamięci zdefiniowanych w strukturze możliwości adresowania wirtualnego.
  5. Operacje UpdatePageTable są wywoływane w celu zainicjowania tabel stron.

Inicjowanie procesu klienta

Po utworzeniu nowego procesu jądro grafiki DirectX:

  • Utwórz początkowe alokacje tabeli stron.
  • Inicjuj alokacje tabeli stron, gdy pierwsza alokacja z procesu staje się rezydentna.