In informatica, uno stack frame è una zona di memoria del call stack che contiene i dati necessari alla subroutine (o funzione) attualmente in esecuzione.

Esso ha, a sua volta, una struttura a stack (pila) e contiene, alla sua base, i dati per ripristinare i registri puntatore del processore (come ad esempio i registri EBP e ESP nell'architettura IA-32), facendoli tornare all'istruzione immediatamente successiva alla chiamata della funzione in esecuzione, nel flusso del programma principale (o della funzione chiamante).

Introduzione

modifica

Quando un programma compilato viene eseguito su un calcolatore, questo deve allocare della memoria per la sua esecuzione.

La memoria per l'esecuzione è una porzione di memoria divisa in zone (segmentazione della memoria):

  • text : che contiene le istruzioni del programma, in linguaggio macchina
  • BSS : usato per immagazzinare variabili globali e/o statiche, contiene le parti corrispondenti alle variabili globali NON inizializzate
  • data : usato per immagazzinare variabili globali e/o statiche, riempito con variabili globali inizializzate (definite in partenza), stringhe e altre costanti che sono usate in tutto il programma.
  • heap : utilizzato per le rimanenti variabili di programma
  • stack : utilizzato per tenere traccia dei punti in cui ogni subroutine attiva dovrebbe restituire il controllo quando termina l'esecuzione e per le variabili locali e parametri delle funzioni.

Lo stack (o Call Stack) viene ulteriormente frammentato con l'utilizzo di stack frame, poiché l'esecuzione del programma non è più lineare nel momento stesso in cui viene richiamata una funzione. Questa deve seguire il suo flusso di comandi, residenti in indirizzi di memoria non sequenziali rispetto a quelli del programma "chiamante". Si crea quindi la necessità di uno "stack nello stack", perché la funzione possa seguire il suo flusso e, terminando, permettere al processore di riprendere il flusso del programma principale laddove si era interrotto (all'indirizzo, quindi, del comando immediatamente successivo a quello di chiamata della funzione, in assembly: "call").

Funzionamento di esempio (architettura IA-32)

modifica

Quando viene richiamata una funzione, diversi elementi vengono inseriti nello stack, in una struttura chiamata stack frame. il registro EBP, chiamato talvolta frame pointer (FP) o local base pointer (LB), viene utilizzato per riferirsi a variabili presenti nel frame dello stack corrente.[1]

Ciascuno stack frame contiene i parametri della funzione, le sue variabili locali e due puntatori che sono necessari per ripristinare la situazione iniziale:

  • il saved frame pointer (SFP)
  • l'indirizzo di ritorno

il SFP viene utilizzato per ripristinare EBP sul suo valore precedente, mentre l'indirizzo di ritorno serve ad impostare EIP (l'Instruction Pointer) all'indirizzo dell'istruzione immediatamente successiva a quella di richiamo della funzione.

Se una funzione venisse richiamata dall'interno di un'altra, un nuovo stack frame verrebbe inserito nello stack e il suo indirizzo di ritorno sarebbe l'indirizzo dell'istruzione successiva al richiamo della funzione chiamata, nella funzione chiamante.

Note

modifica
  1. ^ Erickson, Jon, criptologo., L'arte dell'hacking : le idee, gli strumenti, le tecniche degli hacker, Apogeo, 2004, ISBN 88-503-2280-1, OCLC 799623398. URL consultato il 1º dicembre 2019.

Voci correlate

modifica
  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica

📚 Artikel Terkait di Wikipedia

Buffer overflow

uno stack frame all’interno dello stack (che man mano cresce verso il basso nella struttura descritta sopra, con politica LIFO); all’interno del frame la

Stack trace

chiamato anche stack backtrace o stack traceback, è un elenco degli stack frame attivi in un determinato momento durante l'esecuzione di un programma

Allocazione dinamica della memoria

di vita dell'allocazione stessa non dipende dalla procedura o dallo stack frame correnti. Si accede per via indiretta alla regione di memoria allocata

IA-32

dello stack frame attualmente impiegato) ESI - source index (usato per le stringhe) EDI - destination index (usato per le stringhe) ESP - stack pointer

Call stack

una subroutine all'interno di un call stack è detto frame. Il motivo per cui è necessario adottare un call stack è tenere traccia dei punti in cui ogni

Macchina virtuale Java

queste prodotti. Un frame dello stack di Java è affine a un frame dello stack di un convenzionale linguaggio di programmazione. Ogni frame contiene le informazioni

Variabile non inizializzata

lo spazio riservato allo stack per le variabili, la raccolta di variabili allocate per una subroutine è nota come stack frame. Sebbene il computer riservi

Stack pointer

l'uso dello stack che seguono la logica LIFO ovvero che l'ultimo elemento entrante sarà il primo ad uscire (Last In First Out). La memoria stack funziona