IoMmu-Modell

Auf dieser Seite wird das IoMmu-Modell beschrieben, das in WDDM 2.0 eingeführt wurde. Neuere IOMMU-Updates finden Sie unter IOMMU-basierte GPU-Isolation und IOMMU DMA-Remapping .

Übersicht

Eine Input-Output Memory Management Unit (IOMMU) ist eine MMU-Komponente, die einen DMA-fähigen E/A-Bus mit dem Systemspeicher verbindet. Es ordnet gerätegeschützte virtuelle Adressen physischen Adressen zu, sodass sie bei der Virtualisierung nützlich sind.

Im WDDM 2.0 IoMmu-Modell verfügt jeder Prozess über einen einzelnen virtuellen Adressraum, der zwischen CPU und GPU gemeinsam genutzt wird und vom Arbeitsspeicher-Manager des Betriebssystems verwaltet wird.

Für den Zugriff auf den Arbeitsspeicher sendet die GPU eine Datenanforderung an eine kompatible IOMMU. Die Anforderung enthält eine freigegebene virtuelle Adresse und einen Prozessadressraumbezeichner (PASID). Die IOMMU führt die Adressübersetzung mithilfe der Freigegebenen Seitentabelle durch. Dies wird im folgenden Diagramm veranschaulicht.

Diagramm: IOMMU-Prozessadressraumübersetzung in WDDM 2.0

Der Kernelmodustreiber drückt die Unterstützung für das IoMmu-Modell aus, indem er die DXGK_VIDMMCAPS::IoMmuSupported-Obergrenzen festlegt. Wenn diese Flags festgelegt sind, registriert der Videospeicher-Manager automatisch jeden Prozess, der die GPU mit der IOMMU verwendet, und erhält eine PASID für diesen Prozessadressraum. Die PASID wird während der Geräteerstellung an den Treiber übergeben.

Primäre Zuordnungen werden vom Videospeicher-Manager dem Blendensegment zugeordnet, bevor sie angezeigt werden, um sicherzustellen, dass der Anzeigecontroller physischen Zugriff auf diese Zuordnungen hat.

Im IoMmu-Modell weist der Benutzermodustreiber weiterhin Videospeicher für die GPU zu, indem der Dienst "Zuordnung" des Videospeicher-Managers verwendet wird. Dies ermöglicht dem Benutzermodustreiber Folgendes:

  • Befolgen Sie das Residency-Modell.
  • Unterstützung des Microsoft DirectX-Ressourcenfreigabemodells.
  • Stellen Sie sicher, dass primäre Oberflächen für den Kernel sichtbar sind und der Blende zugeordnet werden, bevor sie angezeigt werden.

Die erste Ebene der Übersetzung (Kachelressourceadresse in freigegebene CPU-/GPU-Adresse) wird vollständig im Benutzermodus vom Benutzermodustreiber verwaltet.