2009-07-30 6 views
2

De wikipedia:.Segmentation de la mémoire sur les systèmes d'exploitation modernes: pourquoi avez-vous besoin de 4 segments?

« Segmentation ne peut pas être désactivé sur processeurs x86, tant de systèmes d'exploitation utilisent un modèle de mémoire plat pour faire la segmentation imperceptibles à programmes Par exemple, le noyau Linux met en place seulement 4 segments »

Je veux dire, puisque la protection est déjà pris en charge par le sous-système de mémoire virtuelle (PTEs ont un peu de protection) pourquoi auriez-vous besoin 4 segments (au lieu de 2: à savoir les données/code avec DPL 3 depuis vous pouvez execu le code résidant dans un segment privilégié inférieur)?

Merci.

Répondre

3

Vous ne cite pas assez de ce wikipedia page où il décrit les quatre segments et pourquoi tous sont nécessaires ...

En général, cependant, les segments implicites sont utilisés. Toutes les extractions d'instructions proviennent du segment de code dans le registre CS . La plupart des références de mémoire proviennent du segment de données dans le registre DS. références de pile du processeur, soit implicitement (par exemple pression et pop instructions) ou explicite (mémoire accède à l'aide de l'ESP ou (E) BP registres) utiliser le segment de pile dans le registre SS . Enfin, les instructions de chaîne (par exemple stos, movs) également utilisent le segment supplémentaire ES.

Donc, si vous voulez mettre en place un modèle plat où les programmeurs ne ont pas besoin de penser à la segmentation, vous avez besoin de mettre en place les quatre de ces registres de segment (CS, DS, SS, ES) avoir la même base. Ensuite, les adresses calculées par rapport aux quatre sont équivalentes.

cette page montre un exemple avec les quatre ensemble à la base = 0, limit = 4Gb

+0

Cela ne répond pas à ma question. La manière dont la segmentation est implémentée en mode protégé est une table d'indirection (ie le GDT/LDT) donc vous pouvez toujours configurer 2 segments et avoir 2 registres pointant vers la même entrée dans le tableau ... –

+0

Vous devriez faire plus évitez les références de segment implicites si vous n'aviez pas de configuration valide pour tous 4. Si CS et DS étaient configurés, vous devez utiliser un préfixe de remplacement de segment pour les instructions où SS et ES sont implicitement utilisés. Il est donc beaucoup plus facile de tout configurer à l'identique. Ensuite, vous pouvez oublier la segmentation existe. Je suis assez rouillé sur mon x86 que je manque probablement un cas où même l'utilisation des préfixes de remplacement causerait plus de problème. Pourquoi ouvrir cette boîte de Pandore? Quel est le problème pour mettre en place tous les 4? –

1

Vous disposez d'un ensemble distinct de segments pour le mode noyau et utilisateur, de sorte que le code de mode utilisateur ne peut pas écrire noyau des données en mode. Ce serait une mauvaise chose.

+0

Ceci est la bonne réponse. L'autre réponse se concentre incorrectement sur le segment _registers_, pas sur les segments eux-mêmes. (Et il manque 2 des 6 registres de segment, 'FS' et' GS'). Les segments existent dans le [GDT] (http://en.wikipedia.org/wiki/Global_Descriptor_Table) et LDT. – MSalters

Questions connexes