Je voudrais programmer et lire les compteurs de performance matérielle offerts sur tous les matériels x86 récents.
Sur Linux, il existe différents systèmes perf_events
(et l’utilitaire perf
pour le faire en dehors d’un programme non modifié).
Existe-t-il une telle fonctionnalité intégrée dans Windows? Si aucune fonction intégrée n’existe, la deuxième solution serait une autre approche utilisant peut-être un code tiers, mais cela ne nécessite pas que je fasse signer un pilote.
Réponse courte
Non, il n’y a pas de fonctionnalité intégrée dans Windows. De plus, la commande linux perf
ne fonctionne pas sur le sous-système Linux pour Windows 10.
Longue réponse
Pour accéder à ces compteurs, vous devez combiner ces instructions:
Malheureusement, ces instructions ne peuvent être appelées qu’à partir du mode kernel, vous devez donc vous connecter avec un pilote. Bien qu’il soit facile d’écrire le code du pilote, il n’est pas si facile de faire signer le pilote (surtout si vous avez indiqué que vous souhaitiez le faire individuellement).
C’est pourquoi je vous conseille de regarder des projets existants comme Open Hardware Monitor et le projet pcm d’Intel.
Open Hardware Monitor
Ce projet open-source est écrit en C # et inclut les binarys et le code source C d’un pilote WinRing0.sys (32 bits) / WinRing0x64.sys (64 bits) développé par OpenLibSys.org. Si vous souhaitez utiliser ce pilote dans votre projet, il vous suffit d’inclure leur avis de copyright .
PCM
Ce projet open-source est écrit en C ++ et contient également des sources pour un pilote similaire (voir le répertoire WinMSRDriver), mais vous devez le créer vous-même pour que vous renconsortingez à nouveau le problème de signature.
Quoi qu’il en soit, je voulais mentionner ce projet car il contient probablement beaucoup de code qui pourrait vous intéresser.
Accès en mode utilisateur
Maintenant, une fois que ce pilote est chargé (Open Hardware Monitor extrait et charge automatiquement le pilote au démarrage de l’application), vous pouvez commencer à appeler ces pilotes IOCTL en utilisant les fonctions Windows CreateFile
/ DeviceIoControl
et bien sûr CloseHandle
depuis votre application en mode utilisateur.