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;
} |
Partager