Papouille a écrit :
Papouille a écrit :
Donc nous ne sommes pas d'accord sur la définition de la segmentation ici. Mon problème se pose sur la segmentation au sein d'un processus, pas entre des processus...
Il y a déjà comme avantage de simplifier l'édition de liens si chaque procédure est dans un segment différent :
Mais la complexité est déplacée de l'éditeur de liens vers le microprocesseur, qui lui doit avoir des registres contenant les adresses de base de chaque segment, non ?
N'est-ce donc pas alors une fausse solution, qui déplace la complexité du software vers le hardware ?
Pas forcément. Sur certains processeurs légers, la segmentation est beaucoup plus facile à gérer que la pagination, parce que l'adresse reele d'un pointeur est très facile à trouver. Suffit de regarder dans la table de segments à l'index dont la valeur est la valeur du registre de segment, et de rajouter l'adresse virtuelle, et on obtient l'adresse reelle. En plus, ce mécanisme permet de doubler la mémoire addressable parce que des données peuvent avoir un pointeur semblable à un pointeur ..text (code) sans que la meme zone mémoire soit pointée. ça permet aussi d'optimiser le cache et d'avoir un cache code et un cache données séparés, sans aucun risque qu'un des caches recouvre les données de l'autre.
donc en fait la segmentation est le modèle le plus simple à implémenter en hard. Le fait que la segmentation soit faite dans le processus meme ou entre les différents processus n'est qu'anecdotique. D'ailleur, la pagination se fait autant dans un processus unique que dans un groupe de processus.
> si une procédure contenue dans un segment n est modifiée et change de
> taille, les autres procédures contenues dans d'autres segments et
> l'appelant n'ont pas besoin d'être modifiées pour faire référence à la
> nouvelle adresse de départ, car celle-ci n'a pas été modifiée.
Ce n'est vrai que pour la premiere procédure, et il y a généralement plus d'une procédure par segment (pas oublier que le nombre de segments possibles dans un meme processus est limité, sans parler que l'espace d'adressage est généralement limité. Mettre une procedure par segment est un gaspillage inutile.
En plus, le principe est le même en pagination. On peut toujours dire ou se trouve la première fonction. Pour le reste, on utilise de la relocation dynamique. D'ailleur si je me souviens bien, DOS faisait automatiquement de la relocation au démarage d'un programme, comme quoi la segmentation n'élimine pas les problèmes de relocation (alors qu'en pagination il est faisable de mapper un bout de code toujours au même endroit. Valgrind utilise cet avantage. Evidement ça ne marche pas si plusieurs codes veulent aller au même endroit dans un même processus...)