2010-06-12 4 views
5

Je suis en train de lire "Understanding Linux Kernel". C'est l'extrait qui explique comment Linux utilise la segmentation que je n'ai pas comprise.Segmentation sous Linux: la segmentation et la pagination sont-elles redondantes?

Segmentation a été inclus dans 80 x 86 microprocesseurs pour encourager programmeurs à partager leurs applications en logiquement liées entités, telles que les sous-routines ou zones de données globales et locales. Cependant, Linux utilise la segmentation d'une manière très limitée. En fait, la segmentation et la pagination sont un peu redondant, parce que les deux peuvent être utilisés pour séparer les espaces d'adresse physique de processus: segmentation peut attribuer un différent l'espace d'adressage linéaire pour chaque processus , alors que la pagination peut mapper la même espace d'adressage linéaire dans différents espaces d'adressage physique . Linux préfère pagination à la segmentation pour les raisons suivantes:

gestion de la mémoire est plus simple lorsque tous processus utilisent le même segment valeurs de registre qui est, quand ils partagent le même ensemble de linéaires adresses.

L'un des objectifs de conception de Linux est la portabilité vers une large gamme d'architectures ; Les architectures RISC en ont en particulier un support limité pour la segmentation .

Tous les processus Linux s'exécutant dans l'utilisateur Le mode utilise la même paire de segments pour des instructions d'adresse et des données. Ces segments sont appelés segment de code utilisateur et segment de données utilisateur, respectivement. De même, tous les processus en cours d'exécution Linux en mode noyau utilisent la même paire de segments pour adresser des instructions et données: ils sont appelés code du noyau segment et segment de données noyau, respectivement. Le tableau 2-3 montre les valeurs des champs Descripteur de segment pour ces quatre segments cruciaux .

Je n'arrive pas à comprendre le 1er et le dernier paragraphe.

+0

C'est bien, mais y a-t-il une question? –

+0

Copie possible de [Différences ou similitudes entre la segmentation segmentée et la segmentation paginée?] (Https://stackoverflow.com/questions/16643180/differences-or-similarities-between-segmented-paging-and-paged-segmentation) –

Répondre

6

La famille 80x86 de processeurs générer une adresse réelle en ajoutant le contenu d'un registre du processeur appelé un registre de segment à celui du compteur de programme. Ainsi, en changeant le contenu du registre de segment, vous pouvez changer les adresses physiques auxquelles le programme accède. La pagination fait quelque chose de similaire en mappant la même adresse virtuelle à différentes adresses réelles. L'utilisation de Linux utilise ce dernier - les registres de segments pour les processus Linux auront toujours le même contenu immuable.

+0

+1 .Linux, et tout le monde aussi de nos jours. –

+7

En mode protégé, ce n'est pas réellement le contenu du registre de segments qui est ajouté aux adresses; le registre de segment contient une référence à un descripteur de segment (stocké en mémoire, dans une table de descripteurs), et l'un des champs du descripteur de segment est l'adresse de base du segment, qui est ajouté au décalage pour générer une adresse linéaire. – caf

+0

La segmentation a été abandonnée dans l'architecture x86-64 (ou amd64 est appelée par Linux). Cette architecture plus récente utilise le modèle de mémoire plate. – hebbo

1

Les systèmes d'exploitation modernes (Linux, autres Unixen, Windows NT, etc.) n'utilisent pas la fonction de segmentation fournie par le processeur x86. Au lieu de cela, ils utilisent un modèle de mémoire 32 bits plat. Chaque processus en mode utilisateur possède son propre espace d'adressage virtuel 32 bits.

(Naturellement, les largeurs sont développés à 64 bits sur les systèmes x86_64)

3

Windows utilise le segment fs pour le stockage de threads local. Par conséquent, wine doit l'utiliser, et le noyau Linux doit le supporter.

2

Intel a d'abord ajouté la segmentation sur le 80286, puis a effectué une pagination sur le 80386. Les systèmes de type Unix utilisent généralement la pagination pour la mémoire virtuelle. Quoi qu'il en soit, puisque la pagination sur x86 ne supportait pas les permissions d'exécution jusqu'à récemment, OpenWall Linux utilisait la segmentation pour fournir des régions de pile non exécutables, c'est-à-dire qu'elle limitait les limites du segment de code. une émulation pour soutenir les trampolines sur la pile.

6

La segmentation et la radiomessagerie ne sont absolument pas redondantes. Le système d'exploitation Linux intègre entièrement la pagination à la demande, mais n'utilise pas la segmentation de la mémoire. Cela donne à toutes les tâches un espace d'adressage virtuel plat et linéaire de 32/64 bits.

La pagination ajoute une autre couche d'abstraction à la traduction d'adresse mémoire. Avec la pagination, les adresses de mémoire linéaire sont mappées sur des pages de mémoire, au lieu d'être traduites directement dans la mémoire physique. Comme les pages peuvent être permutées dans la RAM physique, la pagination permet d'allouer plus de mémoire que ce qui est physiquement disponible. Seules les pages activement utilisées doivent être mappées dans la mémoire physique.

Une alternative à l'échange de pages est l'échange de segments, mais il est généralement beaucoup moins efficace étant donné que les segments sont généralement plus grands que les pages. La segmentation de la mémoire est une méthode d'allocation de plusieurs blocs de mémoire (par tâche) à des fins différentes et permettant à ces blocs d'être protégés les uns des autres. Sous Linux, les sections de code, de données et de pile d'une tâche sont toutes mappées à un seul segment de mémoire.

Les processeurs 32 bits ne disposent pas d'un bit de mode pour désactiver la segmentation , mais le même effet peut être obtenu en mettant en correspondance l'empilement , le code, et des espaces de données à la même plage d'adresses linéaires. Les décalages de 32 bits utilisés par les instructions de processeur 32 bits peuvent couvrir un espace d'adressage linéaire de 0 à 4 gigaoctets de 0 à 4 gigaoctets ( ).

Aditionally, la documentation Intel déclare:

Un modèle plat sans pagination nécessite au minimum un TDG avec un code et un descripteur de segment de données. Un descripteur nul dans la première entrée GDT est également requis. Un modèle plat avec pagination peut prévoir un code et des données descripteurs pour le mode superviseur et une autre série de code et les données descripteurs pour le mode d'emploi

Ceci est la raison pour avoir une paire de CS/DS pour l'exécution de privilège du noyau (anneau 0) et une paire de CS/DS pour l'exécution des privilèges utilisateur (anneau 3). Résumé: La segmentation fournit un moyen d'isoler et de protéger des sections de la mémoire. La pagination fournit un moyen d'allouer plus de mémoire que ce qui est physiquement disponible.

+0

C'est une très bonne réponse! Merci. – fante