Modèle IoMmu
Cette page décrit le modèle IoMmu introduit dans WDDM 2.0. Veuillez consulter la section Isolation GPU basée sur IOMMU et Remappage DMA via IOMMU pour les mises à jour récentes d’IOMMU.
Vue d’ensemble
Une unité de gestion de mémoire entrée-sortie (IOMMU) est un composant matériel qui connecte un bus d’E/S compatible DMA à la mémoire système. Elle mappe des adresses virtuelles visibles par les périphériques à des adresses physiques, ce qui la rend utile en virtualisation.
Dans le modèle IoMmu de WDDM 2.0, chaque processus dispose d’un espace d’adressage virtuel unique qui est :
- Partagé entre le CPU et le GPU.
- Géré par le gestionnaire de mémoire du système d’exploitation.
Pour accéder à la mémoire, le GPU envoie une requête de données à une IOMMU compatible. La requête inclut une adresse virtuelle partagée et un identifiant d’espace d’adressage de processus (PASID). L’IOMMU effectue la traduction d’adresses à l’aide de la table de pages partagée. Cette action est illustrée dans le schéma suivant.
Le pilote d’affichage en mode noyau (KMD) exprime son support du modèle IoMmu en définissant l’indicateur DXGK_VIDMMCAPS::IoMmuSupported. Lorsque cet indicateur est défini, le gestionnaire de mémoire vidéo (VidMm) enregistre automatiquement tout processus utilisant le GPU avec l’IOMMU et obtient un PASID pour cet espace d’adressage de processus. Le PASID est transmis au pilote lors de la création du périphérique.
VidMm mappe les allocations principales dans le segment d’ouverture avant l’affichage, garantissant que le contrôleur d’affichage ait un accès physique à ces allocations.
Dans le modèle IoMmu, le pilote d’affichage en mode utilisateur (UMD) continue d’allouer de la mémoire vidéo pour le GPU en utilisant le service Allocate de VidMm. Ce processus permet à l’UMD de :
- Suivre le modèle de résidence.
- Prendre en charge le modèle de partage de ressources DirectX.
- Garantir que les surfaces principales soient visibles pour le noyau et soient mappées dans l’ouverture avant d’être affichées.
L’UMD gère entièrement le premier niveau de traduction (adresse des ressources en mosaïque vers adresse CPU/GPU partagée) en mode utilisateur.