GNU/Linux >> Linux Esercitazione >  >> Linux

Layout della memoria del programma in linux

se ho un array allocato nello stack, anche un puntatore al primo elemento avrà un valore> inferiore rispetto a un puntatore al secondo elemento?

Non è importante "come" si alloca l'array, è possibile aumentare o diminuire il puntatore dello stack, ma come risultato si dispone di uno spazio di indirizzi riservato per l'array.

Puoi lavorare con loro in modo normale, poiché l'indirizzo più basso è riservato all'elemento 0.

quindi la mia domanda è qual è il layout di memoria corretto per un processo in Linux?

Puoi verificarlo tu stesso. Inserisci da qualche parte nel tuo programma qualcosa come std::cin.get() per mettere in pausa il programma.

Quindi esegui in una shell separata:

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

Questo stampa le mappature di memoria del tuo processo, dove puoi vedere dove l'heap, lo stack e altre cose sono posizionate in memoria.

Informazioni sullo stack:supponiamo che tu abbia una macchina normale con Linux e CPU Intel o AMD a 64 bit. Poi scrivi il seguente codice:

extern void f(int);

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

compilalo e smontalo:

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

puoi vedere (dettagli non importanti rimossi):

 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

come puoi vedere in sub $0x10,%rsp abbiamo riservato spazio nello stack diminuendo (spostandoci verso il basso) il puntatore dello stack.


La prima cosa che mi ha infastidito con quell'immagine è che se l'heap è cresciuto dall'alto verso il basso, se ho assegnato un array sull'heap, un puntatore al secondo elemento non dovrebbe essere più piccolo nel valore int di un puntatore al primo elemento? che creerebbe confusione

Affatto. Supponiamo che tu allochi un array di 10 byte da un pool di memoria che cresce dall'alto verso il basso. Tutto ciò che l'allocatore dovrebbe fare è decrementare il "fondo" di quel pool di memoria di 10, quindi utilizzare quel valore come inizio dell'array allocato. L'array finirebbe quindi al vecchio "fondo". L'aritmetica del puntatore funzionerebbe ancora come previsto, ma "crescerebbe" verso l'indirizzo basso.


Linux
  1. Linux:reale utilizzo della memoria?

  2. Versione Kali Linux 2018.1

  3. Programma Python che consuma RAM

  4. Linux può ripulire la memoria?

  5. Memoria inattiva di Linux

5 consigli per padroneggiare Linux

Comando gratuito in Linux

Come cancellare la memoria di scambio in Linux

Processi Linux:layout di memoria, uscita e funzioni C _exit

Esempi di comandi gratuiti in Linux

Segmentazione della memoria di Linux