Bonjour,
voila j'explique mon petit souci,
je doit faire un allocateur mémoire dans la ram au lieu d'utiliser le "tas"
j'utilise donc les fonction mmap et munmap
j'ai fait une premiere version qui mappe une page_systeme et qui s'arrete quand
la taille de la page est atteinte;
Le probleme est dans la deuxieme version, dès que la taille de la page est atteinte
je remmape en augmentant la taille du fichier mapper.
Le probleme est que les anciennes adresses ne sont pas au meme endroit et donc quand l'utilisateur,"pour qui ma bibliotheque préchargée est transparente", se sert d'un pointeur qu'il avait alloué avant cette augmentation: Sa fait n'importe quoi!!!
c'est logique vu que l'adresse dont il dispose ne correspond plus dans la memoire.
Je ne voit pas comment faire pour que mes anciennes adresses soit toujours au bon endroit?
voila le code de ma fonction augmentation
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 void Augmentation(int entete,int taille){ void *nouveau=NULL; int j=1,test; if(0 != munmap(ptr,TAILLE_FICHIER)) fail_with("taille maximale atteinte et erreur munmap",2); while(TAS+entete+taille>j*getpagesize()) j=j+1; print_debug_int("Augmentation de la taille du fichier de ",(j*getpagesize())-TAILLE_FICHIER); print_debug(" octets\n"); TAILLE_FICHIER=j*getpagesize(); test=lseek(fd,TAILLE_FICHIER,SEEK_SET); if(-1 == test) fail_with("erreur lseek\n",3); write(fd,'\0',1); test=lseek(fd,0,SEEK_SET); if(-1 == test) fail_with("erreur lseek\n",3); nouveau=mmap(0,getpagesize()*j,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0); if( (void *)-1 == nouveau) fail_with("probleme mmap",3); ptr=nouveau; }
je précise que l'entete est une zone que je met devant chaque espace memoire
merci d'avance a ceux qui peuvent m'éclairer
Partager