-\item Il \index{segmento!testo} segmento di testo o \textit{text segment}.
- Contiene il codice del programma, delle funzioni di librerie da esso
- utilizzate, e le costanti. Normalmente viene condiviso fra tutti i processi
- che eseguono lo stesso programma e nel caso delle librerie anche da processi
- che eseguono altri programmi. Viene marcato in sola lettura per evitare
- sovrascritture accidentali (o maliziose) che ne modifichino le istruzioni.
-
- Viene allocato da \func{execve} all'avvio del programma e resta invariato
- per tutto il tempo dell'esecuzione.
-
-\item Il \index{segmento!dati} segmento dei dati o \textit{data segment}.
- Contiene le variabili globali, cioè quelle definite al di fuori di tutte le
- funzioni che compongono il programma, e le variabili statiche, cioè quelle
- dichiarate con l'attributo \ctyp{static}. Di norma è diviso in due parti.
-
- La prima parte è il segmento dei dati inizializzati, che contiene le
- variabili il cui valore è stato assegnato esplicitamente. Ad esempio
- se si definisce:
-\includecodesnip{listati/pi.c}
- questo valore sarà immagazzinato in questo segmento. La memoria di questo
- segmento viene preallocata all'avvio del programma e inizializzata ai valori
- specificati.
-
- La seconda parte è il segmento dei dati non inizializzati, che contiene le
- variabili il cui valore non è stato assegnato esplicitamente. Ad esempio se
- si definisce:
-\includecodesnip{listati/vect.c}
- questo vettore sarà immagazzinato in questo segmento. Anch'esso viene
- allocato all'avvio, e tutte le variabili vengono inizializzate a zero (ed i
- puntatori a \val{NULL}).\footnote{si ricordi che questo vale solo per le
- variabili che vanno nel segmento dati, e non è affatto vero in generale.}
-
- Storicamente questa seconda parte del segmento dati viene chiamata BSS (da
- \textit{Block Started by Symbol}). La sua dimensione è fissa.
-
-\item Lo \itindex{heap} \textit{heap}. Tecnicamente lo si può considerare
- l'estensione del segmento dati, a cui di solito è posto giusto di seguito. È
- qui che avviene l'allocazione dinamica della memoria; può essere
- ridimensionato allocando e disallocando la memoria dinamica con le apposite
- funzioni (vedi sez.~\ref{sec:proc_mem_alloc}), ma il suo limite inferiore,
- quello adiacente al segmento dati, ha una posizione fissa.
-
-\item Il segmento di \itindex{stack} \textit{stack}, che contiene quello che
- viene chiamato \textit{stack} del programma. Tutte le volte che si effettua
- una chiamata ad una funzione è qui che viene salvato l'indirizzo di ritorno
- e le informazioni dello stato del chiamante (come il contenuto di alcuni
- registri della CPU), poi la funzione chiamata alloca qui lo spazio per le
- sue variabili locali. Tutti questi dati vengono \textit{impilati} (da questo
- viene il nome \itindex{stack} \textit{stack}) in sequenza uno sull'altro; in
- questo modo le funzioni possono essere chiamate ricorsivamente. Al ritorno
- della funzione lo spazio è automaticamente rilasciato e
- ``\textsl{ripulito}''.\footnote{il compilatore si incarica di generare
- automaticamente il codice necessario, seguendo quella che viene chiamata
- una \textit{calling convention}; quella standard usata con il C ed il C++
- è detta \textit{cdecl} e prevede che gli argomenti siano caricati nello
- \textit{stack} dal chiamante da destra a sinistra, e che sia il chiamante
- stesso ad eseguire la ripulitura dello \textit{stack} al ritorno della
- funzione, se ne possono però utilizzare di alternative (ad esempio nel
- Pascal gli argomenti sono inseriti da sinistra a destra ed è compito del
- chiamato ripulire lo \textit{stack}), in genere non ci si deve preoccupare
- di questo fintanto che non si mescolano funzioni scritte con linguaggi
- diversi.}
+\item Il \textsl{segmento di testo} o \textit{text segment}. Contiene il
+ codice del programma, delle funzioni di librerie da esso utilizzate, e le
+ costanti. Normalmente viene condiviso fra tutti i processi che eseguono lo
+ stesso programma e nel caso delle librerie anche da processi che eseguono
+ altri programmi.
+
+ Quando l'architettura hardware lo supporta viene marcato in sola lettura per
+ evitare sovrascritture accidentali (o maliziose) che ne modifichino le
+ istruzioni. Viene allocato da \func{execve} all'avvio del programma e resta
+ invariato per tutto il tempo dell'esecuzione.
+\index{variabili!globali|(}
+\index{variabili!statiche|(}
+\item Il \textsl{segmento dei dati} o \textit{data segment}. Contiene tutti i
+ dati del programma, come le \textsl{variabili globali}, cioè quelle definite
+ al di fuori di tutte le funzioni che compongono il programma, e le
+ \textsl{variabili statiche}, cioè quelle dichiarate con l'attributo
+ \direct{static},\footnote{la direttiva \direct{static} indica al compilatore
+ C che una variabile così dichiarata all'interno di una funzione deve
+ essere mantenuta staticamente in memoria (nel segmento dati appunto);
+ questo significa che la variabile verrà inizializzata una sola volta alla
+ prima invocazione della funzione e che il suo valore sarà mantenuto fra
+ diverse esecuzioni della funzione stessa, la differenza con una variabile
+ globale è che essa può essere vista solo all'interno della funzione in cui
+ è dichiarata.} e la memoria allocata dinamicamente. Di norma è diviso in
+ tre parti:
+ \begin{itemize}
+ \item Il segmento dei dati inizializzati, che contiene le variabili il cui
+ valore è stato assegnato esplicitamente. Ad esempio se si definisce:
+ \includecodesnip{listati/pi.c}
+ questo valore sarà immagazzinato in questo segmento. La memoria di questo
+ segmento viene preallocata all'avvio del programma e inizializzata ai valori
+ specificati.
+ \item Il segmento dei dati non inizializzati, che contiene le variabili il
+ cui valore non è stato assegnato esplicitamente. Ad esempio se si
+ definisce:
+ \includecodesnip{listati/vect.c}
+ questo vettore sarà immagazzinato in questo segmento. Anch'esso viene
+ allocato all'avvio, e tutte le variabili vengono inizializzate a zero (ed
+ i puntatori a \val{NULL}).\footnote{si ricordi che questo vale solo per le
+ variabili che vanno nel segmento dati, e non è affatto vero in
+ generale.} Storicamente questa seconda parte del segmento dati viene
+ chiamata \itindex{Block~Started~by~Symbol~(BSS)} BSS (da \textit{Block
+ Started by Symbol}). La sua dimensione è fissa.
+ \index{variabili!globali|)} \index{variabili!statiche|)}
+ \item Lo \textit{heap}, detto anche \textit{free store}. Tecnicamente lo si
+ può considerare l'estensione del segmento dei dati non inizializzati, a
+ cui di solito è posto giusto di seguito. Questo è il segmento che viene
+ utilizzato per l'allocazione dinamica della memoria. Lo \textit{heap} può
+ essere ridimensionato allargandolo e restringendolo per allocare e
+ disallocare la memoria dinamica con le apposite funzioni (vedi
+ sez.~\ref{sec:proc_mem_alloc}), ma il suo limite inferiore, quello
+ adiacente al segmento dei dati non inizializzati, ha una posizione fissa.
+ \end{itemize}
+\item Il segmento di \textit{stack}, che contiene quello che viene chiamato lo
+ ``\textit{stack}'' del programma. Tutte le volte che si effettua una
+ chiamata ad una funzione è qui che viene salvato l'indirizzo di ritorno e le
+ informazioni dello stato del chiamante (come il contenuto di alcuni registri
+ della CPU), poi la funzione chiamata alloca qui lo spazio per le sue
+ variabili locali. Tutti questi dati vengono \textit{impilati} (da questo
+ viene il nome \textit{stack}) in sequenza uno sull'altro; in questo modo le
+ funzioni possono essere chiamate ricorsivamente. Al ritorno della funzione
+ lo spazio è automaticamente rilasciato e ``\textsl{ripulito}''.\footnote{il
+ compilatore si incarica di generare automaticamente il codice necessario,
+ seguendo quella che viene chiamata una \textit{calling convention}; quella
+ standard usata con il C ed il C++ è detta \textit{cdecl} e prevede che gli
+ argomenti siano caricati nello \textit{stack} dal chiamante da destra a
+ sinistra, e che sia il chiamante stesso ad eseguire la ripulitura dello
+ \textit{stack} al ritorno della funzione, se ne possono però utilizzare di
+ alternative (ad esempio nel Pascal gli argomenti sono inseriti da sinistra
+ a destra ed è compito del chiamato ripulire lo \textit{stack}), in genere
+ non ci si deve preoccupare di questo fintanto che non si mescolano
+ funzioni scritte con linguaggi diversi.}