GNU/Linux >> Tutoriels Linux >  >> Linux

Disposition de la mémoire du programme sous Linux

si j'ai un tableau alloué sur la pile, un pointeur vers le premier élément sera également inférieur> en valeur à un pointeur vers le deuxième élément?

Peu importe "comment" vous allouez le tableau, vous pouvez augmenter ou diminuer le pointeur de pile, mais en conséquence, vous avez un espace d'adressage réservé pour le tableau.

Vous pouvez travailler avec eux de manière normale, puisque l'adresse la plus basse est réservée à l'élément 0.

donc ma question est quelle est la disposition correcte de la mémoire pour un processus sous Linux ?

Vous pouvez le vérifier vous-même. Insérez quelque part dans votre programme quelque chose comme std::cin.get() pour mettre votre programme en pause.

Exécutez ensuite dans un shell séparé :

ps aux | grep your_program_name
cat /proc/<pid show by grep>/maps 

Cela imprime les mappages mémoire de votre processus, où vous pouvez voir où le tas, la pile et d'autres éléments sont placés en mémoire.

À propos de la pile :supposons que vous ayez une machine ordinaire avec Linux et un processeur Intel ou AMD 64 bits. Écrivez ensuite le code suivant :

extern void f(int);

void g(int param)
{
    f(param);
}

compilez-le et désassemblez :

g++ -ggdb -c test_my_stack.cc  && objdump -S test_my_stack.o

vous pouvez voir (détails sans importance supprimés) :

 void g(int param)
 {
 0:   55                      push   %rbp
 1:   48 89 e5                mov    %rsp,%rbp
 4:   48 83 ec 10             sub    $0x10,%rsp
 8:   89 7d fc                mov    %edi,-0x4(%rbp)
    f(param);
 b:   8b 45 fc                mov    -0x4(%rbp),%eax

comme vous pouvez le voir dans sub $0x10,%rsp nous avons réservé de l'espace dans la pile en diminuant (en déplaçant vers le bas) le pointeur de pile.


La première chose qui m'a dérangé avec cette image est que si le tas augmentait de haut en bas, alors si j'allouais un tableau sur le tas, un pointeur vers le deuxième élément ne devrait-il pas être plus petit en valeur int qu'un pointeur vers le premier élément ? ce qui serait déroutant

Pas du tout. Disons que vous allouez un tableau de 10 octets à partir d'un pool de mémoire qui augmente de haut en bas. Tout ce que l'allocateur aurait à faire est de décrémenter le "bas" de ce pool de mémoire de 10, puis d'utiliser cette valeur comme début du tableau alloué. Le tableau se terminerait alors à l'ancien "bas". L'arithmétique de pointeur fonctionnerait toujours comme prévu, mais vous "évolueriez" vers une adresse basse.


Linux
  1. Linux - Utilisation réelle de la mémoire ?

  2. Linux Out-of-Memory Killer

  3. Version Kali Linux 2018.1

  4. L'allocation de mémoire sous Linux est-elle non bloquante ?

  5. Comment voir la disposition de la mémoire de mon programme en C pendant l'exécution ?

5 conseils pour maîtriser Linux

Commande gratuite sous Linux

Comment effacer la mémoire d'échange sous Linux

Processus Linux - Disposition de la mémoire, sortie et fonctions C _exit

exemples de commandes gratuits sous Linux

Segmentation de la mémoire Linux