Prérequis

Hello ! o/

La dernière fois on avait vu les arenas, enfin surtout comment la heap était structurée au final, il y a encore des choses à creuser, et une de ces choses sont les bins (les poubelles). En effet, lors de la libération d’un chunk, celui-ci est automatiquement mis dans une bin, et c’est bien sur le rôle de free(3). Pour augmenter les performances de l’allocation mémoire, ptmalloc2 implémente plusieurs bins: fast, unsorted, small et large. Ne vous inquiétez pas, nous allons les détailler une par une et comprendre leur fonctionnement/utilité.

Fast bins

Comme nous l’avons vu dans l’article sur les arenas, il y a un tableau de 10 éléments qui correspond à fastbinsY. Ces éléments sont en réalité des listes chaînées de tailles 16, 24, 32, …, 80, donc avec un pas/step de 8 octets/bytes. Une particularité de ces chunks c’est qu’on ne permet pas leur fusion pour former un chunk plus gros.

Source: Understanding glibc malloc, sploitfun

Unsorted bin

Dans le cas où vous libérez un chunk qui correspond à une bin Small ou Large, en premier lieu il est mis dans l’Unsorted bin. Ceci permet de laisser une 2è chance au chunk, si vous devez free une structure pour ré-allouer derrière une structure de même taille, cette structure prend toute son importance dans la performance d’allocation et de gestion de mémoire. Il n’y a qu’une bin et elle est sous la forme d’une double liste chaînée circulaire (DCLL: Doubly Circular Linked List).

Source: Understanding glibc malloc, sploitfun

Small bins

Il y a 62 small bins, toutes les small bins sont des DCLL et acceptent tous les chunks < 512 octets. Elles sont evidemment moins rapides que les fast bins. Leur taille vont de 16 à 504 avec un pas de 8. Il y a effectivement une possibilité de fusion, donc si 2 chunks free sont collés et qu’on peut y mettre un chunk qui demande à être alloué, on les fusionne.

Large bins

Il y a 63 large bins, tous les chunks sont >= à 512 octets. Ce sont les bins les plus lentes et sont triées dans un ordre bien précis:

Nombre de bins Start End Step
32 512 2432 64
16 2433 10240 512
8 10241 40960 4096
4 40961 131072 32768
2 131073 524288 262144
1 524289 x

Ici évidemment les chunks n’ont pas tous la même taille dans une large bin et la fusion de chunks est possible. Et heureusement ! Sinon imaginez les trous en mémoire que ça ferait..

La suite ici !