begin process at 2012 05 27 20:20:59
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Système

 > LECTURE/ECRITURE DES MSR (MODEL SPECIFIC REGISTER) EN C SOUS LINUX

LECTURE/ECRITURE DES MSR (MODEL SPECIFIC REGISTER) EN C SOUS LINUX


 Information sur la source

Note :
Aucune note
Catégorie :Système Classé sous :msr, linux Niveau :Débutant Date de création :03/01/2006 Date de mise à jour :03/01/2006 21:18:07 Vu / téléchargé :8 057 / 137

Auteur : MetalDwarf

Ecrire un message privé
Commentaire sur cette source (0)
Ajouter un commentaire et/ou une note

 Description

Alors voilà une petite explication :
Chaque processeur x86 vient avec un ensemble de registres spécifiques qui permettent de connaître et de modifier dans certains cas la configuration du processeur... Les numéros des MSR et leur rôle est décrit dans la documentation du processeur. Ils sont bien entendu spécifiques à chaque processeur, alors quel est l'intérêt?

Sur les Pentium M, il existe 2 MSR très intéressants : les 0x198 et 0x199. Ils sont utilisés dans la gestion de l'energie, et permettent de modifier le coefficient multiplicateur  et le voltage du processeur. Ceci permet d'underclocker le processeur et de réduire le voltage afin d'augmenter l'autonomie et de diminuer le dégagement de chaleur.
Sous Windows des logiciels comme NHC le font, mais pas sous Linux.

Les deux programmes joints permettent de lire et d'écrire des MSR, grâce à l'interface kernel /dev/cpu/0/msr (En effet l'instruction assembleur ne peut pas être executée directement à cause des privilèges définis par Intel). Il faut donc que le module msr soit chargé ("modprobe msr" en root), ou alors que le kernel soit configuré proprement.

Ce code a été testé avec un kernel 2.6.12 sur un P-M 760.

Un lien vers un site sur ces MSR du Pentium M :

http://www.x86-secret.com/articles/cm/g5m100-n/ itxpm-8.htm

Source

  • /* Programme d'écriture de MSR - Utilise l'interface kernel */
  • /* Donc que le support soit compilé dans le noyau ou que le */
  • /* module msr soit chargé (modprobe msr) */
  • /* D'après /usr/src/linux/arch/i386/kernel/msrc.c : */
  • /*
  • * msr.c
  • *
  • * x86 MSR access device
  • *
  • * This device is accessed by lseek() to the appropriate register number
  • * and then read/write in chunks of 8 bytes. A larger size means multiple
  • * reads or writes of the same register.
  • *
  • * This driver uses /dev/cpu/%d/msr where %d is the minor number, and on
  • * an SMP box will direct the access to CPU %d.
  • */
  • #include <stdio.h>
  • #include <stdlib.h>
  • #include <sys/types.h>
  • #include <unistd.h>
  • #include <sys/stat.h>
  • #include <fcntl.h>
  • int main(int argc, char **argv)
  • {
  • unsigned long long int value;
  • unsigned int number;
  • int fd;
  • printf("Write MSR - Write Specifc Model Register\n");
  • if(argc < 3)
  • {
  • fprintf(stderr,"\nUsage : %s <MSR number> <value>\nValues MUST be given in Hexadecimal format\n",argv[0]);
  • exit(0);
  • }
  • sscanf(argv[1],"%x",&number);
  • sscanf(argv[2],"%Lx",&value);
  • printf("MSR number :\t0x%x\nMSR value :\t0x%Lx\n",number,value);
  • if(setuid(0) != 0) // On prend les droits root pour pouvoir ouvrir le fichier
  • {
  • fprintf(stderr, "\nYou must be root to run this program or have the setuid bit set.\n");
  • exit(-1);
  • }
  • if((fd = open("/dev/cpu/0/msr",O_WRONLY)) == -1)
  • {
  • fprintf(stderr,"\nOpen error on /dev/cpu/0/msr\n");
  • exit(-1);
  • }
  • if(lseek(fd,number,SEEK_SET) == -1)
  • {
  • fprintf(stderr,"\nSeek error in /dev/cpu/0/msr\n");
  • exit(-1);
  • }
  • if(write(fd,&value,8) != 8)
  • {
  • fprintf(stderr,"\nWrite error in /dev/cpu/0/msr\n");
  • exit(-1);
  • }
  • close(fd);
  • return 0;
  • }
/* Programme d'écriture de MSR - Utilise l'interface kernel 	*/
/* Donc que le support soit compilé dans le noyau ou que le 	*/
/* module msr soit chargé (modprobe msr) 			*/

/* D'après /usr/src/linux/arch/i386/kernel/msrc.c :		*/

/*
 * msr.c
 *
 * x86 MSR access device
 *
 * This device is accessed by lseek() to the appropriate register number
 * and then read/write in chunks of 8 bytes.  A larger size means multiple
 * reads or writes of the same register.
 *
 * This driver uses /dev/cpu/%d/msr where %d is the minor number, and on
 * an SMP box will direct the access to CPU %d.
 */

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>



int main(int argc, char **argv)
{
	unsigned long long int value;
	unsigned int number;
	int fd;

	printf("Write MSR - Write Specifc Model Register\n");
 
	if(argc < 3)
	{
		fprintf(stderr,"\nUsage : %s <MSR number> <value>\nValues MUST be given in Hexadecimal format\n",argv[0]);
		exit(0);
	}
	
	sscanf(argv[1],"%x",&number);
	sscanf(argv[2],"%Lx",&value);

	printf("MSR number :\t0x%x\nMSR value :\t0x%Lx\n",number,value);

	if(setuid(0) != 0)	// On prend les droits root pour pouvoir ouvrir le fichier
	{
		fprintf(stderr, "\nYou must be root to run this program or have the setuid bit set.\n");
		exit(-1);
	}
	
	if((fd = open("/dev/cpu/0/msr",O_WRONLY)) == -1)
	{
		fprintf(stderr,"\nOpen error on /dev/cpu/0/msr\n");
		exit(-1);
	}
	if(lseek(fd,number,SEEK_SET) == -1)
	{
		fprintf(stderr,"\nSeek error in /dev/cpu/0/msr\n");
		exit(-1);
	}
	if(write(fd,&value,8) != 8)
	{
		fprintf(stderr,"\nWrite error in /dev/cpu/0/msr\n");
		exit(-1);
	}
	close(fd);
	return 0;
}

 Conclusion

Pour compiler aucune option particulière à signaler : gcc write_msr.c -o write_msr.

Juste un détail : il faut que le programme soit lancé en root (à cause des protections d'accès toujours...)

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

03 janvier 2006 21:18:07 :
Ajout du lien

 Sources du même auteur

Source avec Zip Source avec une capture SOLUTION GRAPHIQUE APPROCHÉE AU PROBLÈME DES N CORPS
Source avec Zip Source avec une capture SERVEUR DE CHAT MULTITHREADE EN C SOUS LINUX
Source avec Zip TESTE SI UN TRES GRAND NOMBRE (PLUSIEURS MILLIERS DE CHIFFRE...
COMMENT UN PC FAIT DES MULTIPLICATIONS...
Source avec Zip COMPRESSION BZ2 (MIEUX QUE ZLIB) EN C.

 Sources de la même categorie

Source avec Zip Source avec une capture INFORMATION PROCESSEUR (CPUID) par Devils_Tiger
Source avec Zip Source avec une capture LECTURE TEMPÉRATURE PROCESSEUR par Devils_Tiger
Source avec Zip Source avec une capture LECTURE FRÉQUENCE PROCESSEUR par Devils_Tiger
Source avec Zip Source avec une capture UNE LISTE HÉTÉROGÈNE DOUBLEMENT CHAINÉE par pgl10
Source avec Zip Source avec une capture POUR AFFICHER LES CARACTÈRES ACCENTUÉS SOUS WINDOWS EN MODE ... par pgl10

 Sources en rapport avec celle ci

Source avec Zip TRAITEMENT D'IMAGE PGM par Jios
Source avec Zip Source avec une capture INFORMATION PROCESSEUR (CPUID) par Devils_Tiger
Source avec Zip Source avec une capture LECTURE TEMPÉRATURE PROCESSEUR par Devils_Tiger
Source avec Zip Source avec une capture LECTURE FRÉQUENCE PROCESSEUR par Devils_Tiger
Source avec une capture COLORIMÈTRE NUMÉRIQUE LINUX par valchek

Commentaires et avis

Aucun commentaire pour le moment.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

portage Linux vers visual C++ [ par acsx ] Salut,J'ai un programme écrit en C sous Linux et je souhaite le faire tourner sous Visual C++ 6.0 sous Windows.J'ai donc créé un projet win32 et intég Problème pour ouvrir une fenetre et écrire dedans sous Linux en C++ [ par Nicolas ] Je souhaiterais savoir comment ouvrir une fenetre sous linux en C++(pour écrire dedans avec des "cout")MerciA+ Nicolas Problème pour ouvrir une fenetre sous linux en c++ [ par Nicolas ] Je souhaiterais savoir comment ouvrir une fenetre sous linux en C++(pour écrire dedans avec des "cout")MerciA+ Nicolas Problème pour ouvrir une fenetre sous linux en c++ [ par Nicolas ] Je souhaiterais savoir comment ouvrir une fenetre sous linux en C++(pour écrire dedans avec des "cout")MerciA+ Nicolas Linux et opengl [ par FleXus ] Helloje voudrais savoir comment utiliser et compiler un prog avec les fonctions d'opengl sous linux(j'utilise actuellement Kdevelop clone de visual c+ processus sous linux [g++] [ par satanik_mike ] Bonjour,Je suis en train de d?velopper un serveur POP, SMTP en C++ sous linux, mais je bloque sur une petit probl?me d'ex?cution.J'ai fait un ex?cutbl Comment compiler avec GTK (sous linux) [ par defcon ] Bonjour à touse, voilà, je voulais savoir comment compiler mon code source souis linux (avec librairie GTK)???Merci d'avance pour votre réponse.Amical Comment compiler GTK (sous linux)??? [ par defcon ] Bonjour à touse, voilà, je voulais savoir comment compiler mon code source souis linux (avec librairie GTK)???Merci d'avance pour votre réponse.Amical Thread [ par Vince007 ] Bonjour, je vous laisse se message pour savoir si qqu'un qui connait bien les thread et les sémaphores sous Linux pourrait m'indiquer la méthode de co codes sources linux [ par Edzome ] salut à tous !!!je désire savoir ou est-ce que je peux me procurer le code source du SE linux...merci d'avance...


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,671 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales