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