[SOS] Virtual Memory Manager
David Decotigny
David.Decotigny at free.fr
Mer 5 Oct 09:35:23 CEST 2005
Bonjour,
KAISER Edouard wrote:
> - On pourrait agrandir la limite du descripteur de segment : problème
> on peut écraser des données qui suivent la mémoire décrite par ce
> descripteur, mémoire qui peut appartenir à un autre processus : donc
> impossible a priori comme solution.
Si, possible. A condition d'avoir un allocateur de segments global
capable de detecter les recouvrements et (surtout) de les eviter.
> - On pourrait créer un nouveau descripteur de segment dans la LDT du
> processus dont la limite serait la taille de la mémoire que l'on
> souhaite allouer et qui décrirait donc un emplacement libre de cette
> taille en mémoire vive : Problème, nous avons donc un nouveau segment
> de données. Comment faire pour que le processus puisse utiliser ce
> segment ? Cela implique un changement de DS, enfin cette solution me
> semble irréalisable, je ne saurai meme pas comment la gérer, mais me
> semble la plus propre.
Avec gcc c'est pas evident : il repose tres tres peu sur un moedele
multi-segments et ne gere pas tout seul le passage d'un segment a
l'autre : il faut l'aider. Je connais assez peu gcc, mais je vois une
solution pas belle pour lui specifier que certaines variables sont dans
un segment a part : devoyer le modificateur "__thread" qui permet
d'adresser des variables relativement au segment gs (ou fs, de memoire).
Normalement ca sert pour le "TLS" (thread local storage).
Peut-etre une autre solution est de s'inspirer de l'adressage dynamique
a la ld.so en le biaisant un peu pour passer via des segments (je pense
que ca marche assez mal cependant). Autre solution : regarder du cote
d'autres compilateurs capables de gerer en interne des adresses sous la
forme segment:offset.
> - Solution trés crade et absolument pas performante : On recherche un
> emplacement mémoire contigu et assez grand pour contenir le processus
> + la taille de la mémoire qu'il souhaite allouer, de ce fait on aurait
> tout dans le meme segment. C'est une solution absurde mais c'est la
> seule qui me semble fonctionelle oO
Celle-la au moins elle marche sans trop d'effort de programmation mais
elle est au prix d'une lourdeur a l'execution.
Bienvenue dans le monde merveilleux de la fragmentation memoire.
Une autre solution : utiliser la pagination derriere ton segment de
donnees. Comme ca tu continues d'utiliser principalement la segmentation
sauf pour l'alloc dynamique.
Voyez-vous autre chose a dire ?
Bonne journee,
Plus d'informations sur la liste de diffusion Sos