Memory layout dei programmi

Aree di memoria

L'esecuzione di un programma necessita di tre aree di memoria (che in UNIX sono chiamate regioni):

Esempio: esecuzione di un programma in C

#include <stdio.h>

//Variabili globali -> area dati
int a = 5;
int b = 6;

int f2(int h){
	int k = h+15; //Variabile locale
	// (punto 3)
	return k;
}

int f1(int s, int t){
	int u = a + s + t; //Variabile locale
	// (punto 2)
	int v = f2(u); //Variabile locale
	// (punto 4)
	return v;
}

int main(void){
	int x = 10; //Variabile locale
	// (punto 1)
	int y = f1(x, b); //Variabile locale
	// (punto 5)
	printf("ecco il valore di y: %d\\n", y);
}

Per questo esempio, si assume che:

Untitled

  1. In questo punto del codice, lo stack contiene solo il record di attivazione di main, con la variabile locale x inizializzata (al valore 10), mentre y non è ancora stata inizializzata (qui indicato con ??). Invece, le variabili globali a e b, memorizzate nell'area dati, sono state inizializzate ancora prima dell'esecuzione di main.
  2. A questo punto, sopra al frame di main è stato aggiunto quello di f1, nel quale:
  3. Con la chiamata di f2, è stato aggiunto un ulteriore record di attivazione in cima alla pila:
  4. Quando f2 è terminata:
  5. Essendo terminata anche f1, il suo record di attivazione viene rimosso dallo stack, lasciando solo quello di main, e il valore restituito è stato assegnato a y. L'esecuzione di main continuerà dall'istruzione macchina successiva alla chiamata di f1.

Indirizzi di memoria

Il codice di memoria contiene indirizzi di memoria, che si riferiscono: