Prérequis

Hello ! o/

A travers une série d’articles vous allez comprendre comment la heap est gérée dans l’implémentation de ptmalloc2. ptmalloc2 est le système de la heap qui est actuellement utilisé dans la glibc, on peut aussi l’appeler “POSIX Thread Malloc v2”. Comme d’habitude, on verra assez en profondeur pour que vous ayez une vue qui ne soit pas biaisée, mais pas trop non plus, sinon il suffirait de vous rediriger vers le code source..

Ces articles sont divisés en 4 et nous en tirerons tous les détails nécessaires:

Pour introduire la heap, quoi de mieux qu’un peu de contexte: la heap permet de gérer les allocations dynamiques, typiquement quand vous voulez créer une structure de donnée qui augmente de taille au runtime, genre une liste chaînée. La stack ne pouvant pas gérer ce type d’allocation du fait que chaque stackframe (mémoire réservée à une fonction) a une taille définit par les déclarations des variables, donc écrire par dessus d’autres variable risque très fortement d’en réécrire d’autres. Toute la problématique d’une heap réside dans la vitesse d’allocation et de gestion de la mémoire: il faut pouvoir réutiliser au mieux et au plus vite ce qui a été libéré. La heap est donc un espace mémoire à part entière de la stack, elle est créée par l’intermédiaire de votre premier malloc(3), ou d’un call sur brk(2), mmap(2) ou tout autre syscall qui peut créer une plage d’adresses mémoire.

#include <stdio.h>
#include <stdlib.h>

int
main (int argc,
      char * argv [])
{
    unsigned short i;
    short * ptr;

    if (argc > 1)
    {
        fprintf(stderr, "[!] Error: Usage: ./program\n");
        exit(EXIT_FAILURE);
    }
    // Il n'y a toujours pas de heap en mémoire à partir d'ici
    ptr = (short *) malloc ( sizeof(short) * 10 );
    // El là, elle est déclarée
    
    for (i = 0; i < 10; i++)
    {
        ptr[i] = i;
    }
    fprintf(stdout, "%hd\n", ptr[3]);
    
    return EXIT_SUCCESS;
}

La suite ici !