Question

Comment puis-je déterminer la quantité de mémoire de chaque pilote de périphérique consomme? Je suppose cela peut être fait avec une API Win32 ou .NET, mais je suis tout simplement pas été en mesure de déterminer quels.

Était-ce utile?

La solution

Je sais que ce n'est pas trivial. Voici quelques points de départ pour des questions étroitement liées:

Vous pouvez obtenir un début (probablement pas satisfaisant) en utilisant VirtualQueryEx pour déterminer la mémoire utilisée par les fichiers PE, tas, etc. Voici un programme qui fournit un carte mémoire virtuelle de vue. Cela devrait répondre à la taille de l'image du pilote de périphérique.

La difficulté est plus grande dans la détermination de la manière de marquer la mémoire allouée dynamiquement par le code qui est attribution. Le meilleur coup, il est d'utiliser quelque chose comme pour suivre les détours de la mémoire dynamique allocations comme ils sont faits et la pile à pied pour déterminer le orginator. Enfin, le fait que vous souhaitez le faire pour les pilotes de périphériques prend un peu plus loin. Je doute des détours peuvent être utilisés pour les pilotes de périphériques (même si je ne sais pas vraiment). Je ne sais marcher la pile d'un pilote de périphérique est très non trivial.

Vous pouvez également être en mesure d'obtenir les données que vous voulez à partir procexp dans le Sysinternals Suite . Lancez-le Aller au « système », allez dans Affichage / show volet inférieur, activez dll. Ensuite, faites un clic droit sur les en-têtes de colonnes et ajouter celles pour le jeu de travail par exemple 'WS Total'. Je ne sais pas ce que cela fait de les étiqueter correctement la mémoire. Sur ma boîte, il leur donne cartographiés taille de l'image des pilotes de périphériques, mais simplement 0K dans les colonnes du jeu de travail. Je prends l'absence d'une réponse de procexp comme preuve raisonnable que la résolution de ce problème ne sera pas tournemain.

Bonne chance.

Autres conseils

de Windows suivi de l'utilisation de la mémoire du pilote de périphérique avec des étiquettes de piscine. Si vous savez ce que la piscine balises le conducteur en question passe à ExAllocatePoolWithTag , alors vous pouvez suivre son utilisation de la mémoire en utilisant des outils tels que poolmon (de le Windows Driver Kit), pooltag (de OSR), ou WinDbg (ou KD) (à partir des outils de débogage pour Windows).

Notez que les pilotes de périphérique peuvent appeler les API du noyau qui allouent indirectement la mémoire. Par exemple, appeler IoAllocateMdl provoquera le gestionnaire d'E / S Windows pour allouer de la mémoire pour une liste de descripteurs de mémoire, en utilisant une balise de pool différent qui est attribué par le gestionnaire d'E / S de Windows. Pour cette raison, les allocations effectuées au nom des pilotes de périphériques multiples peuvent tous utiliser la même balise de pool.

Si vous essayez de déterminer quel pilote est une fuite de mémoire, utilisez poolmon / pooltag / WinDbg / KD identifier la balise de pool (s) qui sont fuite. Ensuite, fixez un débogueur du noyau (WinDbg ou KD) au système et régler la nt!poolhittag variable à la balise de pool qui fuit. La prochaine fois que ExAllocatePoolWithTag est appelée à allouer de la mémoire avec cette balise de pool, le système se brisera dans le débogueur du noyau, et ensuite vous pouvez regarder la pile d'appel pour savoir quel pilote effectue l'allocation. Ce processus est décrit plus en détail dans Utilisation du noyau Debugger pour trouver un mode noyau fuite de mémoire .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top