Vérification DMA

La vérification DMA surveille l’utilisation de l’accès direct à la mémoire (DMA). Étant donné que les routines DMA ont changé à mesure que Windows a développé, de nombreux pilotes utilisent incorrectement les appels DMA. En outre, certains enregistreurs de pilotes tentent de contourner complètement le sous-système HAL DMA. Cette pratique peut introduire des bogues insidieux dans le pilote.

L’option Vérification DMA du vérificateur de pilote tente d’intercepter les erreurs DMA courantes. Avec l’extension de débogueur du noyau !dma , elle peut être utilisée pour vérifier qu’un pilote utilise DMA de manière appropriée.

Cette option driver verifier est également appelée vérification HAL. Certains messages d’erreur générés par Driver Verifier peuvent utiliser ce terme.

Différents types de DMA

DMA est un mécanisme par lequel un appareil matériel peut transférer des données vers ou depuis la mémoire sans utiliser le processeur. Le processeur est requis pour configurer le transfert, et l’appareil signale le processeur lorsqu’il a terminé le transfert. L’avantage de ce système est que le processeur peut effectuer d’autres tâches pendant que le transfert DMA est effectué.

Il existe plusieurs types de DMA utilisés dans Windows 2000 et versions ultérieures :

DMA de mémoire tampon commune
Common-buffer DMA est effectué lorsque le système peut allouer une mémoire tampon unique accessible à la fois par le matériel et le logiciel. Le pilote est responsable de la synchronisation des accès à la mémoire tampon. La mémoire n’est pas mise en cache, ce qui facilite cette synchronisation pour le pilote. Après avoir configuré une mémoire tampon commune, le pilote et le matériel peuvent écrire directement dans les adresses de la mémoire tampon sans intervention de la part de hal.

DMA de paquets
Le DMA de paquet est effectué lorsqu’il existe une seule mémoire tampon existante qui doit être mappée pour être utilisée par le matériel. Par exemple, le transfert d’un fichier de la mémoire vers un disque est un exemple d’utilisation de DMA de paquets. L’utilisation de DMA de mémoire tampon commune dans cette situation serait inutile, car le fichier doit être transféré vers la mémoire tampon commune avant que le matériel puisse le transférer sur le disque. Au lieu de cela, le HAL est consulté; il fournit au pilote les informations dont il a besoin pour aider le matériel à trouver la mémoire tampon réelle en mémoire. Cette opération est compliquée par la nécessité pour les routines impliquées de travailler sur différentes architectures.

Nuage de points/regroupements DMA
Nuage de points/regroupements DMA est une méthode de raccourci qui configure plusieurs transferts DMA de paquets à la fois. Si vous transférez un paquet sur le réseau, par exemple, chaque partie de la pile réseau ajoute son propre en-tête (TCP, IP, Ethernet, etc.). Ces en-têtes sont tous alloués à partir de différents emplacements en mémoire. Dans ce cas, l’assistant DMA de nuages de points/regroupements fait gagner du temps en émettant une demande de traitement par lot à hal pour mapper chaque en-tête et le segment de données pour l’accès par le matériel. Au lieu d’avoir à appeler les routines DMA de paquets sur chaque partie du paquet, cette méthode appelle chaque routine une fois, et permet à hal d’être responsable du mappage de chacune d’elles individuellement.

Remarque Lafonctionnalité De diffusion/collecte ne signifie pas que l’appareil peut utiliser les routines de diffusion/collecte. La fonctionnalité de diffusion/collecte fait référence à un indicateur dans la description de l’appareil qui indique que l’appareil est en mesure de lire ou d’écrire à partir de n’importe quelle zone en mémoire, au lieu d’une seule plage.

DMA système
La DMA système est effectuée en programmant le contrôleur DMA système sur la carte mère pour effectuer le transfert directement. Seules les cartes ISA peuvent utiliser le système DMA.

Effets de la vérification DMA

Lorsque la vérification DMA est active, le vérificateur de pilote détecte les mauvaises utilisations des routines DMA, notamment :

  • Dépassement ou sous-exécution de la mémoire tampon DMA (ces erreurs peuvent être effectuées par le matériel ou le pilote).

  • Double libération d’une mémoire tampon commune, d’un canal d’adaptateur, d’un registre de carte ou d’une liste de points/regroupements.

  • Fuite de mémoire en ne libérant pas les mémoires tampons courantes, les canaux d’adaptateurs, les registres cartographiques, les listes de points/regroupements ou les adaptateurs.

  • Avoir plusieurs canaux d’adaptateurs présents pour un adaptateur à la fois.

  • Tentative d’utilisation d’un adaptateur qui a déjà été libéré et qui n’existe plus.

  • Ne pas vider une mémoire tampon de l’adaptateur.

  • Avoir trop de nombres de références en attente pour un adaptateur.

  • Exécution de DMA sur une mémoire tampon paginable (toutes les mémoires tampons doivent être verrouillées avant le début du transfert DMA).

  • Exécution de DMA sur une MDL avec des indicateurs mangles.

  • Le référencement d’une adresse système non valide, soit avant la première MDL, soit après la fin de la première MDL, soit à l’aide d’une longueur de transfert supérieure à la mémoire tampon MDL et franchit une limite de page dans la MDL.

  • Allocation d’un trop grand nombre de registres de carte à la fois ou allocation de plus de registres cartographiques que le nombre maximal autorisé.

  • Double mappage des registres de carte.

  • Tentative de libérer des registres mappés alors que certains sont encore mappés.

  • Tentative de vidage d’un registre de carte qui n’a pas été mappé.

  • Tentative de vidage d’un trop grand nombre d’octets à la fin du fichier de registre de carte.

  • Appel de routines DMA à un IRQL incorrect.

  • Passage d’une DMA_ADAPTER de valeur Null à une routine HAL.

  • Passage d’une adresse et d’une MDL à une routine HAL lorsque l’adresse n’est pas contenue dans la MDL.

  • Tentative de mappage d’une plage d’adresses qui a déjà été mappée.

  • Tentative de vidage d’une mémoire tampon qui n’est pas mappée.

  • Tentative de mapper une mémoire tampon de longueur nulle pour le transfert.

  • Appel de la fonction obsolète HalGetAdapter (tous les pilotes doivent utiliser IoGetDmaAdapter à la place).

Driver Verifier surveille le comportement du pilote et émet des bogues case activée 0xE6 si l’une de ces violations se produit. Pour obtenir la liste des paramètres de case activée, consultez Vérification des bogues 0xE6 (DRIVER_VERIFIER_DMA_VIOLATION).

Quand la vérification DMA est-elle utile ?

Tous les pilotes qui utilisent DMA directement (en appelant les routines HAL DMA) doivent être testés avec la vérification DMA.

En outre, les pilotes miniport doivent également être testés, car ils utilisent souvent DMA indirectement (en appelant des pilotes de port qui utilisent DMA).

La vérification DMA peut également être un moyen efficace de détecter l’altération de la mémoire, car elle peut détecter quand un pilote ou un périphérique matériel dépasse une mémoire tampon DMA.

Surveillance de la vérification DMA

L’extension du débogueur de noyau !dma peut être utilisée pour afficher une multitude d’informations DMA. Il peut afficher différents détails sur le comportement de chaque adaptateur DMA. Vous trouverez un exemple détaillé de l’extension !dma , ainsi que des informations générales sur les extensions de débogueur, dans la documentation du package Outils de débogage pour Windows. Pour plus d’informations, consultez Débogage Windows .

Activation de cette option

Vous pouvez activer la fonctionnalité vérification DMA pour un ou plusieurs pilotes à l’aide du Gestionnaire du vérificateur de pilotes ou de la ligne de commande Verifier.exe. Pour plus d’informations, consultez Sélection des options du vérificateur de pilote.

  • Sur la ligne de commande

    Sur la ligne de commande, l’option Vérification DMA est représentée par Bit 7 (0x80). Pour activer la vérification DMA, utilisez une valeur d’indicateur 0x80 ou ajoutez 0x80 à la valeur de l’indicateur. Par exemple :

    verifier /flags 0x80 /driver MyDriver.sys
    

    La fonctionnalité sera active après le prochain démarrage.

    Sur Windows Vista et les versions ultérieures de Windows, vous pouvez également activer et désactiver la vérification DMA sans redémarrer l’ordinateur en ajoutant le paramètre /volatile à la commande. Par exemple :

    verifier /volatile /flags 0x80 /adddriver MyDriver.sys
    

    Ce paramètre prend effet immédiatement, mais il est perdu lorsque vous arrêtez ou redémarrez l’ordinateur. Pour plus d’informations, consultez Utilisation de paramètres volatiles.

    La fonctionnalité vérification DMA est également incluse dans les paramètres standard. Par exemple :

    verifier /standard /driver MyDriver.sys
    
  • Utilisation du Gestionnaire du vérificateur de pilotes

    1. Démarrez le Gestionnaire du vérificateur de pilotes. Tapez Vérificateur dans une fenêtre d’invite de commandes.
    2. Sélectionnez Créer des paramètres personnalisés (pour les développeurs de code), puis cliquez sur Suivant.
    3. Sélectionnez Sélectionner des paramètres individuels dans une liste complète.
    4. Sélectionnez (case activée) vérification DMA.

    La fonctionnalité Vérification DMA est également incluse dans les paramètres standard. Pour utiliser cette fonctionnalité, dans Le Gestionnaire du vérificateur de pilotes, cliquez sur Créer des paramètres standard.