Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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. De plus, certains développeurs 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 de Driver Verificationr tente d’intercepter les erreurs DMA courantes. En plus de l’extension du 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 de vérificateur de pilote 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
La DMA de mémoire tampon commune est effectuée 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 hal.
DMA de paquet
La DMA de paquet est effectuée lorsqu’il existe une seule mémoire tampon existante qui doit être mappée pour une utilisation par le matériel. Un exemple d’utilisation de la DMA de paquet est le transfert d’un fichier de la mémoire vers un disque. L’utilisation de DMA de mémoire tampon commune dans ce cas serait gaspillée, 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.
Réparti/collecte DMA
Le scatter-gather DMA est une méthode simplifiée qui configure plusieurs transferts DMA de paquets en une seule opération. Si vous transférez un paquet sur le réseau, par exemple, chaque couche du 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, le DMA de scatter/gather économise du temps en émettant une demande de traitement par lot à la HAL pour mapper chaque en-tête et le segment de données pour l’accès par le matériel. Au lieu d’appeler les routines DMA de paquets sur chaque partie du paquet, cette méthode appelle chaque routine une seule fois et permet au HAL de mapper chacun d’eux individuellement.
Remarque la fonctionnalité scatter/gather ne signifie pas que l'appareil peut utiliser les routines scatter/gather. La capacité de dispersion/collecte fait référence à un indicateur dans la description de l'appareil qui montre que l'appareil est en mesure de lire ou d'écrire à partir de n'importe quelle zone en mémoire, au lieu d'une plage spécifique.
DMA système
La DMA système est effectuée en programmant le contrôleur DMA du système sur la carte mère afin d'effectuer le transfert directement. Seules les cartes ISA peuvent utiliser la DMA système.
Effets de la vérification DMA
Lorsque la vérification DMA est active, le vérificateur de pilotes détecte les mauvaises utilisations des routines DMA, notamment :
Dépassement ou sous-utilisation de la mémoire tampon DMA (ces erreurs peuvent être provoquées par le matériel ou le pilote).
Libération double d’une mémoire tampon commune, d’un canal d’adaptateur, d’un registre de carte ou d’une liste de dispersion/collection.
Fuite de mémoire en ne libérant pas les tampons communs, les canaux d’adaptateur, les registres de mappage, les listes de dispersion/agrégation ou les adaptateurs.
Avoir plusieurs canaux d’adaptateur présents pour un adaptateur à la fois.
Tentative d’utilisation d’un adaptateur qui a déjà été libéré et n’existe plus.
Ne pas vider un 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 un MDL avec des indicateurs corrompus.
Référencer une adresse système non valide, soit avant le premier MDL, soit après la fin du premier MDL, soit en utilisant une longueur de transfert plus longue que la mémoire tampon MDL et franchit une limite de page dans le MDL.
Allocation d’un trop grand nombre de registres de carte à la fois ou allocation de plus de registres de carte que le nombre maximal autorisé.
Mappage double des registres de carte.
Tentative de libération des registres de mappage alors que certains sont encore mappés.
Tentative de vidage d’un registre de carte qui n’a pas été mappé.
Tentative de vidage de trop d'octets à la fin du registre de mappage.
Appel de routines DMA à un IRQL incorrect.
Passage d’une valeur nulle DMA_ADAPTER à une routine HAL.
Passage d’une adresse et d’un MDL à une routine HAL lorsque l’adresse n’est pas contenue dans le MDL.
Tentative de mappage d’une plage d’adresses déjà mappée.
Tentative de vidage d’une mémoire tampon qui n’est pas mappée.
Tentative de mappage d’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).
Le Driver Verifier surveille le comportement du pilote et génère un contrôle de bogues 0xE6 si l'une de ces violations survient. Consultez Vérification des erreurs 0xE6 (DRIVER_VERIFIER_DMA_VIOLATION) pour obtenir la liste des paramètres de vérification des erreurs.
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 les 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. Il existe 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é de 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 de 0x80 ou ajoutez 0x80 à la valeur de l’indicateur. Par exemple:
verifier /flags 0x80 /driver MyDriver.sysLa fonctionnalité sera active après le démarrage suivant.
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.sysCe paramètre est effectif immédiatement, mais est perdu lorsque vous arrêtez ou redémarrez l’ordinateur. Pour plus d’informations, consultez Utilisation des paramètres volatiles.
La fonctionnalité vérification DMA est également incluse dans les paramètres standard. Par exemple:
verifier /standard /driver MyDriver.sysUtilisation du Gestionnaire du Vérificateur de Pilotes
- Démarrez le Gestionnaire du Vérificateur de pilotes. Tapez Verifier dans une fenêtre de l'invite de commandes.
- Sélectionnez Créer des paramètres personnalisés (pour les développeurs de code), puis cliquez sur Suivant.
- Sélectionnez Sélectionner des paramètres individuels dans une liste complète.
- Sélectionnez (cochez) 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.