Création de la région / segment de tas dans Linux

Je crois comprendre que sur Linux, le chargeur de process ne crée pas automatiquement une région «en tas» pour un process comme c'est le cas pour la stack, n'est-ce pas?

J'ai utilisé /proc/$$/maps et avant l'appel à malloc() il n'y avait pas de "tas".

Linux ne crée pas automatiquement une région pour les deux segments, tas et stack.

Dans les langages de programmation, il y a toujours un point d'input, où le contrôle est transféré du operating system au programme. En C, c'est la fonction main() .

Chaque process sous Linux a un mappage de memory de 4 Go en 32 bits et 8 To dans les environnements 64 bits. C'est la quantité maximale de memory qu'il est possible d'adresser par le operating system. Notez que cela est indépendant de la memory physique de votre système. Chaque process donne l'illusion qu'il est seul sur l'ordinateur.

Avant d'appeler main() , le operating system pousse les éléments de la command line utilisée pour invoquer le programme, en haut de la stack initialement vide, où se trouve le segment de stack . Si le main() appelle lui-même une fonction, les arguments de passage sont poussés dans le segment de stack.

  4GB/8TB┌───────────┐ │ stack │ <- main(), argc/argv parameters and functions, growing downwards ├ ─ ─ ─ ─ ─ ┤ │ │ │ │ <- empty │ │ │ │ ├───────────┤ │ data │ <- static data and literal constants ├───────────┤ │ text │ <- all the instructions; the comstackd code 0└───────────┘ 

Maintenant votre question:

J'ai utilisé /proc/$$/maps et avant l'appel à malloc il n'y avait pas de "tas" région.

La memory de tas : Un process peut se développer dans la partie inoccupée de la memory virtuelle lors de l'exécution en utilisant l'appel système malloc() . Cette memory allouée dynamicment est située au-dessus des données dans le segment de segment . Il est donc normal qu'il n'y ait pas de segment de segment ni de segment avant le premier appel de malloc() .

  4GB/8TB┌───────────┐ │ stack │ <- main(), argc/argv parameters and functions, growing downwards ├ ─ ─ ─ ─ ─ ┤ │ │ │ │ <- empty ├ ─ ─ ─ ─ ─ ┤ │ heap │ <- malloc()'d memory space, growing upwards ├───────────┤ │ data │ <- static data and literal constants ├───────────┤ │ text │ <- all the instructions; the comstackd code 0└───────────┘