En informatique, la segmentation est une technique gérée par l'unité de segmentation de la MMU, utilisée sur les systèmes d'exploitation modernes, qui divise la mémoire physique (dans le cas de la segmentation pure) ou la mémoire virtuelle (dans le cas de la segmentation avec pagination) en caractérisés par leur adresse de début et leur taille (décalage).
La segmentation permet la séparation des données et du programme (entre autres segments) dans des espaces logiquement indépendants facilitant alors la programmation, l'édition de liens et le partage interprocessus. La segmentation permet également d'offrir une plus grande protection grâce au niveau de privilège de chaque segment (voir ).
Un segment mémoire est un espace d'adressage indépendant défini par deux valeurs :
Un segment constitue donc dans la mémoire principale une plage d'adresse continue.
Une adresse logique d'une donnée désirée est donc exprimée sous la forme (segment, décalage), le segment étant référencé par le (16 bits) et le décalage (offset) exprimé dans un champ de 32 bits.
Les segments se chevauchent donc tous les 16 bits. On peut donc adresser la même zone mémoire avec plusieurs couple segment/offset.
Par exemple :
Segment | : | Offset |
00FFAC | : | 000008 |
00FFA0 | : | 0000C8 |
00FF00 | : | 000AC8 |
00F000 | : | 00FAC8 |
000000 | : | 0FFAC8 |
On remarquera que pour passer d'un adressage par segment à un adressage par offset on multiplie simplement par 10h.
Il existe différents types de segment :
Lorsque la MMU doit traduire une adresse logique en adresse linéaire, l'unité de segmentation doit dans un premier temps utiliser la première partie de l'adresse, c’est-à-dire le , pour retrouver les caractéristiques du segment (base, limit, DPL, etc.) dans la table de descripteurs (GDT ou LDT). Puis il utilise la valeur de décalage (sur 32 bit) qui référence l'adresse à l'intérieur du segment.
Il existe sur la majorité des processeurs actuels, des registres de segments (cs, ds, ss, etc.) qui contiennent le sélecteur de segment dernièrement utilisé par le processeur et qui sont utilisés pour accélérer l'accès à ces sélecteurs.
Sur les processeurs récents, il existe également des registres associés à chaque registre de segment et qui contiennent le associé pour un accès plus rapide aux descripteurs.
Un descripteur de segment est une structure à 8 octets contenant les caractéristiques d'un segment.
Les segments les plus utilisés voient leur descripteur référencé dans la GDT (Global Descriptor Table), les autres peuvent se situer dans une LDT (Local Descriptor Table).
Un descripteur de segment est utilisé conjointement à un sélecteur de segment pour permettre la traduction des adresses logiques en adresses linéaires.
Un descripteur contient les champs suivants :
Lorsqu'un sélecteur est chargé dans un registre de segment (cs, ds, ss, etc.), le descripteur associé est chargé dans un registre associé au registre de segment (s'il n'y est pas déjà présent). Ainsi l'unité de segmentation chargée de traduire les adresses logiques en adresses linéaires n'a pas besoin de se référer à chaque fois à une table de descripteurs située dans la mémoire principale.
Outre les segments qu'un programmeur peut insérer grâce à une table locale de descripteurs, il existe de nombreux segments généraux dont presque tous sont référencés dans la table globale de descripteurs.