IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Linux Kernel Developpement


Sujet :

Linux

  1. #1
    Invité(e)
    Invité(e)
    Par défaut Linux Kernel Developpement
    Bonjour,

    Je suis nouveau parmis vous, je susi étudiant en GEII (Génie électrique et informatique industrielle). Actuellement en stage de fin de 2ème année, je rencontre des difficulté face a mon sujet et vien quémander un peu d'aide après avoir tout essayé... (je n'ai plus vraiment d'idée)

    Voici une description de mon matériel :
    Je programme sur une station de travail sous Linux Debian 3.1 Sarge avec un kernel 2.6.
    Mon but est de programmer un microcontroleur ARM9 (muni de 32mo de flash et 32mo de ram) qui embarque une distribution allégé de linux (qui tient sur 11mo).

    Descriptif de mon problème :
    Je dois réaliser un module (driver) Linux.
    Celui-ci doit controler les voiEntrées/Sorties du microcontrolleur.
    Afin de réaliser cette tache, je doit modifier des données directement dans des registres mémoire (protégé par les MMU de linux).
    Mon problème est donc la déprotection de la mémoire ainsi que le mapping des adresses.

    J'ai réussi, via un programme appelé devmem2 (voir sur google) a modifier ces adresses mémoire a mon gré, le problème c'est que c'est un programme et non un module.
    J'aimerais donc adapter ce programme pour qu'il puisse fonctionner comme un module.

    Voici la source de la fonction du programme (ne pas confonrdre avec le module) qui réalise la l'action désiré :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    #include <stdio.h> //essentielle
    #include <errno.h> //essentielle
    #include <fcntl.h> //essentielle
    #include <sys/mman.h> //essentielle
     
     
    #define FATAL do { fprintf(stderr, "Error at line %d, file %s (%d) [%s]\n", \
      __LINE__, __FILE__, errno, strerror(errno)); exit(1); } while(0)
     
    #define MAP_SIZE 4096UL
    #define MAP_MASK (MAP_SIZE - 1)
     
    int fct_write_in_address (off_t addresse, unsigned long operation)
    {
    	int fd;
    	void *map_base, *virt_addr; 
     
    	if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) FATAL; //ouvre la memoire en lecture/ectiture
     
    	map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, addresse & ~MAP_MASK);
    	/* void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset)
    	Etablir une projection en mémoire des fichiers ou des périphériques.
    	La fonction mmap demande la projection en mémoire de length octets commencant à  la position 
    	offset depuis un fichier (ou un autre objet) indiqué par le descripteur fd, de préférence à  l'adresse 
    	pointée par start. Cette adresse n'est qu'une préférence, généralement 0. La véritable adresse ou 
    	l'objet est projeté est renvoyée par la fonction mmap.
     
    	MAP_SIZE : (voir #define plus haut) 
    	PROT_READ : On peut lire le contenu de la zone mémoire.
    	PROT_WRITE : On peut écrire dans la zone mémoire.
    	MAP_SHARED : Partager la projection avec tout autre processus utilisant l'objet. L'écriture 
    		dans la zone est équivalente à une écriture dans le fichier. 
    	MAP_MASK : (voir #define plus haut)
     
    	mmap renvoie un pointeur sur la zone de mémoire
    	<unistd.h> <sys/mman.h>*/
     
    	if(map_base == (void *) -1) FATAL;
     
    	virt_addr = map_base + (addresse & MAP_MASK);
     
    	*((unsigned long *) virt_addr) = operation;
     
    	if(munmap(map_base, MAP_SIZE) == -1) FATAL; 
    	/*int munmap(void *start, size_t length)	
    	Supprimer une projection en mémoire des fichiers ou des périphériques.*/
     
    	close(fd);
    	return 0;
    }
    J'aimerais pouvoir modifier ce bout de code pour que cela fonctionne dans un driver ou si vous avez des idées plus intéréssente que moi, je reste ouvert.

    Merci

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Bonjour,

    Citation Envoyé par philvl
    J'aimerais donc adapter ce programme pour qu'il puisse fonctionner comme un module.
    Le problème c'est qu'un module n'a pas grand chose à voir avec un programme : pas de fonction main, impossible d'utiliser les fonctions de la bibliothèque standard (uniquement celle du noyau, par exemple plus de printf, il faut utiliser printk pour écrire dans les log).

    Sans parler des différences entre le mode noyau et le mode utilisateur.

    Le plus simple serai d'appeler ton programme à partir du module.

    Un peu de lecture : Linux Driver Kit

  3. #3
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    sinon voila de la doc Linux Device Drivers, Third Edition

  4. #4
    Membre Expert
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Par défaut
    +1 une seule adresse :
    le_kit_de_survi_du_developpeur_linux

    Le livre que donne gnto se trouve dans le kit

Discussions similaires

  1. Linux kernel developpement avec un driver [tutoriel].
    Par Luke spywoker dans le forum Contribuez
    Réponses: 8
    Dernier message: 05/05/2014, 12h48
  2. Linux kernel developpement
    Par Luke spywoker dans le forum Débuter
    Réponses: 5
    Dernier message: 24/02/2014, 12h01
  3. sous-section Linux Kernel dans la section développement Linux
    Par kromartien dans le forum Evolutions du club
    Réponses: 1
    Dernier message: 13/04/2007, 09h36
  4. Linux->kernel->sources : Documentation
    Par doccpu dans le forum Administration système
    Réponses: 3
    Dernier message: 04/09/2006, 11h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo