Annonce

Réduire
Aucune annonce.

La segmentation de la mémoire

Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • Tutoriel La segmentation de la mémoire

    Ce tutoriel a pour but de présenter les rudiments de la segmentation de la mémoire dans un programme informatique.

    Cette base nous permettra (plus tard) d'attaquer le sujet des dépassements de buffers, également appelés buffer overflow.

    La segmentation, késako ?
    Lorsqu'un programme informatique est exécuté, il est chargé dans la mémoire de l'ordinateur. Il pourra ainsi, lors de son exécution, accéder à ses variables, en créer, en modifier, ...

    C'est aussi grâce à ce placement judicieux dans la mémoire Ram de l'ordinateur que le processeur de ce dernier pourra suivre la suite des instructions composants le programme. Il suivra les appels de fonctions, de procédures chacune ayant ses propres instructions et ses propres variables.

    Si on analyse les deux derniers paragraphes, on peut remarquer que la mémoire allouée à un programme gère des données de plusieurs types :
    • Ses propres variables
    • Ses propres instructions
    • Les variables des différentes fonctions qui le composent


    Gérer une telle quantité de donnée demande de l'organisation.

    C'est pourquoi la mémoire interne d'un programme tournant sur votre ordinateur sera composée de différentes parties. C'est ce qu'on appelle la segmentation.

    Les différents segments de la mémoire



    Les segments de la mémoire sont au nombre de 5.

    Ceux ci sont nommés respectivement :
    1. Le segment de texte
    2. Le segment de données
    3. Le segment bss
    4. Le segment de tas
    5. Le segment de pile


    Chacun de ses segments a son rôle et nous allons ci dessous expliquer le rôle et les caractéristiques de chacun de ces segments.

    Le segment de texte
    Le segment de texte est également appelé segment de code. C'est lui qui contient les instructions à exécuter (en langage machine).

    L'exécution de ce segment n'est pas linéaire. En effet, certaines instructions pourraient très bien demander d'opérer un saut vers une autre adresse du segment texte avant de revenir en arrière dans les adresses mémoires.

    On peut par contre affirmer que ce segment est de taille fixe. En effet, après compilation, il n'est plus possible d'ajouter ou d'enlever des instructions. Ainsi, si il mesure 300 octets lors d'une première exécution, il est certain qu'il en fera également 300 lors d'une suivante.

    Ce segment est également en lecture seule. Toute tentative de modification sera repérée par l'ordinateur et conduira à l'affichage d'une erreur ainsi qu'à la fin immédiate du programme pour des raisons de sécurité.
    Un autre avantage de cette technique est que le segment texte peut être partagé entre différentes instances d'un même programme. Ainsi, même si le programme est lancé plusieurs fois, le segment texte ne se trouvera qu'une seule fois dans la RAM.


    Le segment de données
    Ce segment de mémoire permet de stocker les variables globales et statiques initialisées.

    Pour rappel, ces types de variables sont accessibles de partout dans le programme. Quel que soit la fonction dans laquelle on se trouve donc.

    Ces ce mécanisme de séparation qui permet de rendre ces variables accessibles de partout.

    Ces variables étant crées dans le programme avant sa compilation, ce segment mémoire a une taille fixe.
    Il est cependant disponible en lecture ainsi qu'en écriture.


    Le segment bss
    Ce segment de mémoire permet, comme le segment de données, de stocker des variables statiques et globales, à la différences prêt que dans le segment de bss, ces variables statiques et globales sont non initialisées.

    Comme dans le cas du segment de données, ce segment est de taille fixe et est disponible en lecture et en écriture.

    Le segment de tas
    Ce segment peut être manipulé par le programmeur.

    C'est à dire que celui ci peut réserver des blocs de mémoire dans le tas et les utiliser à sa guise. Une fois l'utilisation terminée, ces blocs mémoire peuvent être désalloués.

    Le tas est donc un segment dont la taille varie au fur et à mesure que le programmeur l'utilise.

    Il est bon de noter que le tas est une mémoire grandissant vers le bas (vers les adresses mémoires hautes).


    Le segment de pile
    La pile est un segment de la mémoire dont la taille est également variable.

    Il faut savoir que chaque fonctions appelée par le programme a son environnement propre.
    C'est dans cet environnement que sont stockées les variables locales de la fonction, les paramètres qu'elle a reçus, l'adresse de retour (afin que le processeur puisse se replacer au bon endroit dans le segment texte après l'exécution de la fonction), en somme, tout le contexte de la fonction. Cet environnement est appelé bloc d'activation de la fonction.

    Dans le jargon informatique, une pile est une structure de donnée de type FILO (First In Last Out). C'est à dire que le premier élément à arriver dans la pile sera le dernier à en sortir.

    Pour comprendre l'utilisation d'une pile, prenons l'exemple d'une boite ouverte uniquement sur le dessus.
    Si l'on place trois feuilles dans la boite, on devra enlever la troisième et la seconde avant de pouvoir enlever la première. C'est le fonctionnement de la pile.

    Cette utilisation peut paraitre étrange mais dans le contexte du segment de pile, elle est très utile.
    En effet, si la fonction main fait appel à la fonction1 qui fait elle même appel à la fonction2, à la fin de la fonction2 ces données sont dépilées et ce sont les données de la fonction1 qui doivent être rechargées. Or, la structure de pile nous assure justement que ce seront ces informations, ces données qui seront directement accessibles.

    En conclusion
    Dans cet article, nous avons découvert ce qu'est la segmentation de la mémoire et quels sont les principaux segments dans la mémoire d'un programme.

    Pour résumer :
    • Le segment texte contient les instructions en langage machine du programme en cours d'exécution
    • Le segment de donnée et le segment de bss contiennent les variables statiques et globales
    • Le tas contient les données dynamiques du programme
    • La pile contient les blocs d'activation des fonctions du programme

    Dans ces différents blocs, les plus intéressants sont sans doutes les segments de tas et de pile. Ce sont pour ainsi dire les plus actifs et également ceux qui offrent le plus de possibilités. Par exemple au niveau du buffer overflow (dont nous parlerons dans de futurs tutoriels).
Chargement...
X