\subsection{I concetti generali}
\label{sec:proc_mem_gen}
+\index{memoria~virtuale|(}
+
Ci sono vari modi in cui i sistemi operativi organizzano la memoria, ed i
dettagli di basso livello dipendono spesso in maniera diretta
dall'architettura dell'hardware, ma quello più tipico, usato dai sistemi
-unix-like come Linux è la cosiddetta \index{memoria~virtuale} \textsl{memoria
- virtuale} che consiste nell'assegnare ad ogni processo uno spazio virtuale
-di indirizzamento lineare, in cui gli indirizzi vanno da zero ad un qualche
-valore massimo.\footnote{nel caso di Linux fino al kernel 2.2 detto massimo
- era, per macchine a 32bit, di 2Gb. Con il kernel 2.4 ed il supporto per la
- \textit{high-memory} il limite è stato esteso anche per macchine a 32 bit.}
-
+unix-like come Linux è la cosiddetta \textsl{memoria virtuale} che consiste
+nell'assegnare ad ogni processo uno spazio virtuale di indirizzamento lineare,
+in cui gli indirizzi vanno da zero ad un qualche valore massimo.\footnote{nel
+ caso di Linux fino al kernel 2.2 detto massimo era, per macchine a 32bit, di
+ 2Gb. Con il kernel 2.4 ed il supporto per la \textit{high-memory} il limite
+ è stato esteso anche per macchine a 32 bit.}
Come accennato nel cap.~\ref{cha:intro_unix} questo spazio di indirizzi è
virtuale e non corrisponde all'effettiva posizione dei dati nella RAM del
farà da supporto a tutte le pagine di memoria virtuale di tutti i processi che
hanno detta funzione nel loro codice.
-La corrispondenza fra le pagine della \index{memoria~virtuale} memoria
-virtuale di un processo e quelle della memoria fisica della macchina viene
-gestita in maniera trasparente dal kernel.\footnote{in genere con l'ausilio
- dell'hardware di gestione della memoria (la \textit{Memory Management Unit}
- del processore), con i kernel della serie 2.6 è comunque diventato possibile
- utilizzare Linux anche su architetture che non dispongono di una MMU.}
-Poiché in genere la memoria fisica è solo una piccola frazione della memoria
-virtuale, è necessario un meccanismo che permetta di trasferire le pagine che
-servono dal supporto su cui si trovano in memoria, eliminando quelle che non
-servono. Questo meccanismo è detto \index{paginazione} \textsl{paginazione}
-(o \textit{paging}), ed è uno dei compiti principali del kernel.
+La corrispondenza fra le pagine della memoria virtuale di un processo e quelle
+della memoria fisica della macchina viene gestita in maniera trasparente dal
+kernel.\footnote{in genere con l'ausilio dell'hardware di gestione della
+ memoria (la \textit{Memory Management Unit} del processore), con i kernel
+ della serie 2.6 è comunque diventato possibile utilizzare Linux anche su
+ architetture che non dispongono di una MMU.} Poiché in genere la memoria
+fisica è solo una piccola frazione della memoria virtuale, è necessario un
+meccanismo che permetta di trasferire le pagine che servono dal supporto su
+cui si trovano in memoria, eliminando quelle che non servono. Questo
+meccanismo è detto \index{paginazione} \textsl{paginazione} (o
+\textit{paging}), ed è uno dei compiti principali del kernel.
Quando un processo cerca di accedere ad una pagina che non è nella memoria
reale, avviene quello che viene chiamato un \itindex{page~fault} \textit{page
permettono di bloccare il meccanismo della \index{paginazione} paginazione e
mantenere fisse delle pagine in memoria (vedi sez.~\ref{sec:proc_mem_lock}).
+\index{memoria~virtuale|)}
\subsection{La struttura della memoria di un processo}
\label{sec:proc_mem_layout}
\itindex{page~fault} \textit{page fault} mandando un segnale \signal{SIGSEGV}
al processo, che normalmente ne causa la terminazione immediata.
-È pertanto importante capire come viene strutturata \index{memoria~virtuale}
-la memoria virtuale di un processo. Essa viene divisa in \textsl{segmenti},
-cioè un insieme contiguo di indirizzi virtuali ai quali il processo può
-accedere. Solitamente un programma C viene suddiviso nei seguenti segmenti:
+È pertanto importante capire come viene strutturata la memoria virtuale di un
+processo. Essa viene divisa in \textsl{segmenti}, cioè un insieme contiguo di
+indirizzi virtuali ai quali il processo può accedere. Solitamente un
+programma C viene suddiviso nei seguenti segmenti:
\begin{enumerate*}
\item Il \index{segmento!testo} segmento di testo o \textit{text segment}.
Contiene il codice del programma, delle funzioni di librerie da esso