[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