Che cos’è e come funziona lo stack in informatica

Che cos’è e come funziona lo stack in informatica

Lo stack è un’area di memoria contigua gestita in modalità Last In First Out (LIFO), cioè l’ultimo oggetto inserito è il primo ad essere rimosso. Le due operazioni principali sono push (aggiunge un elemento in cima allo stack) e pop (rimuove un elemento dalla cima dello stack).

Uno stack è un blocco contiguo di memoria contenente dati. Un registro chiamato stack pointer (SP) punta alla cima dello stack. La base dello stack è a un indirizzo fissato. La sua dimensione è adattata dinamicamente dal kernel al momento dell’avvio. La CPU implementa le istruzioni di PUSH e di POP. Lo stack consiste di un’ insieme di segmenti logici (stack frame) che vengono inseriti nello stack quando viene chiamata una funzione ed eliminati quando la funzione ritorna. Uno stack frame contiene i parametri della funzione, le sue variabili locali, i dati necessari per ripristinare il precedente stack frame, incluso l’indirizzo dell’istruzione successiva alla chiamata (contenuto nell’instruction pointer o IP).

Che cos'è e come funziona lo stack in informatica

A seconda dell’implementazione lo stack cresce verso l’alto o il basso. Qui si assume che cresca verso indirizzi di memoria bassi, che è quanto succede sui processori Intel. Anche lo stack pointer dipende dall’implementazione: può puntare all’ultimo indirizzo sullo stack o al prossimo indirizzo libero. Noi assumiamo che punti all’ultimo elemento pieno dello stack. In aggiuna allo stack pointer, che punta alla cima dello stack (indirizzi numericamente più bassi), è spesso conveniente avere un frame pointer (FP), chiamato anche base pointer(BP) che punta a una fissata locazione in un frame. Principalmente, le variabili locali possono essere riferite specificando il loro offset dall’SP, ma non appena viene inserita o rimossa una word dallo stack, questi offset cambiano mentre riferendoci al FP.tali offset restano fissi per l’intera vita della funzione. Su processori Intel, il BP (EBP) è usato per questo scopo. La prima cosa che una procedura deve fare quando è chiamata è salvare l’FP precedente in modo da poter essere ripristinato all’uscita dalla procedura stessa. Poi copia l’SP nell’FP per creare il nuovo FP, e sposta l’SP verso indirizzi di memoria più bassi per riservare spazio per le variabili locali.

Evoluzione stack durante l'esecuzione del programma
Evoluzione stack durante l’esecuzione del programma

Perché si usa lo Stack?

I linguaggi di programmazione moderni hanno il costrutto di procedura o funzione. Una chiamata a procedura altera il flusso di controllo come un salto (jump), ma, diversamente da questo, una volta finito il proprio compito, una funzione ritorna il controllo all’istruzione successiva alla chiamata. Questa astrazione può essere implementata con il supporto di uno stack. Lo stack è usato per passare parametri alla funzione, per allocare dinamicamente le sue variabili locali, e contiene anche tutte le informazioni necessarie per il ripristino delle condizioni precedenti alla sua chiamata compresi il Frame Pointer (FP) e l’Instruction Pointer(IP) gestiti tramite i registri EBP e EIP nell’Intel 386.

Precedente Che cos'è e come funziona il Buffer overflow in informatica Successivo Differenza tra Disaster recovery e Backup in informatica

Lascia un commento