Revisionati gli errori di mmap e risistemate alcune indicizzazioni (ed
[gapil.git] / fileadv.tex
index dd0550bb217889eec63594533ddfcb13cb6ddd03..e5313642070f22b19db1e8308888fe2eaf70ae52 100644 (file)
@@ -3727,7 +3727,6 @@ lo standard POSIX.1b prevede una funzione apposita, \funcd{aio\_cancel}, che
 permette di cancellare una operazione richiesta in precedenza; il suo
 prototipo è:
 
-
 \begin{funcproto}{
 \fhead{aio.h}
 \fdecl{int aio\_cancel(int fd, struct aiocb *aiocbp)}
@@ -3749,7 +3748,7 @@ La funzione permette di cancellare una operazione specifica sul file
 specificando \val{NULL} come valore di \param{aiocbp}. Quando una operazione
 viene cancellata una successiva chiamata ad \func{aio\_error} riporterà
 \errcode{ECANCELED} come codice di errore, ed mentre il valore di ritorno per
-\func{aio\_return} sarà -1, inoltre il meccanismo di notifica non verrà
+\func{aio\_return} sarà $-1$, inoltre il meccanismo di notifica non verrà
 invocato. Se con \param{aiocbp} si specifica una operazione relativa ad un
 file descriptor diverso da \param{fd} il risultato è indeterminato.  In caso
 di successo, i possibili valori di ritorno per \func{aio\_cancel} (anch'essi
@@ -3778,7 +3777,7 @@ specifica operazione; il suo prototipo è:
 
 \begin{funcproto}{
 \fhead{aio.h}
-\fdecl{int aio\_suspend(const struct aiocb * const list[], int nent, 
+\fdecl{int aio\_suspend(const struct aiocb * const list[], int nent, \\
 \phantom{int aio\_suspend(}const struct timespec *timeout)}
 \fdesc{Attende il completamento di una operazione di I/O asincrono.} 
 }
@@ -3796,43 +3795,58 @@ specifica operazione; il suo prototipo è:
   
 La funzione permette di bloccare il processo fintanto che almeno una delle
 \param{nent} operazioni specificate nella lista \param{list} è completata, per
-un tempo massimo specificato da \param{timout}, o fintanto che non arrivi un
-segnale (si tenga conto che questo segnale potrebbe essere anche quello
-utilizzato come meccanismo di notifica). La lista deve essere inizializzata
-con delle strutture \struct{aiocb} relative ad operazioni effettivamente
-richieste, ma può contenere puntatori nulli, che saranno ignorati. In caso si
-siano specificati valori non validi l'effetto è indefinito.  Un valore
-\val{NULL} per \param{timout} comporta l'assenza di timeout.
+un tempo massimo specificato dalla struttura \struct{timespec} puntata
+da \param{timout}, o fintanto che non arrivi un segnale (si tenga conto che
+questo segnale potrebbe essere anche quello utilizzato come meccanismo di
+notifica). La lista deve essere inizializzata con delle strutture
+\struct{aiocb} relative ad operazioni effettivamente richieste, ma può
+contenere puntatori nulli, che saranno ignorati. In caso si siano specificati
+valori non validi l'effetto è indefinito.  
+Un valore \val{NULL} per \param{timout} comporta l'assenza di timeout, mentre
+se si vuole effettuare un \textit{polling} sulle operazioni occorrerà
+specificare un puntatore valido ad una struttura \texttt{timespec} (vedi
+fig.~\ref{fig:sys_timespec_struct}) contenente valori nulli, e verificare poi
+con \func{aio\_error} quale delle operazioni della lista \param{list} è stata
+completata.
 
 Lo standard POSIX.1b infine ha previsto pure una funzione, \funcd{lio\_listio},
 che permette di effettuare la richiesta di una intera lista di operazioni di
 lettura o scrittura; il suo prototipo è:
-\begin{prototype}{aio.h}
-  {int lio\_listio(int mode, struct aiocb * const list[], int nent, struct
+
+
+\begin{funcproto}{
+\fhead{aio.h}
+\fdecl{int lio\_listio(int mode, struct aiocb * const list[], int nent, struct
     sigevent *sig)}
-  
-  Richiede l'esecuzione delle operazioni di I/O elencata da \param{list},
-  secondo la modalità \param{mode}.
-  
-  \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di
-    errore, nel qual caso \var{errno} assumerà uno dei valori:
-    \begin{errlist}
+
+\fdesc{Richiede l'esecuzione di una serie di operazioni di I/O.} 
+}
+
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
+  \begin{errlist}
     \item[\errcode{EAGAIN}] nessuna operazione è stata completata entro
       \param{timeout}.
+    \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale.
     \item[\errcode{EINVAL}] si è passato un valore di \param{mode} non valido
       o un numero di operazioni \param{nent} maggiore di
       \const{AIO\_LISTIO\_MAX}.
     \item[\errcode{ENOSYS}] la funzione non è implementata.
-    \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale.
-    \end{errlist}
-  }
-\end{prototype}
+  \end{errlist}
+}
+\end{funcproto}
 
 La funzione esegue la richiesta delle \param{nent} operazioni indicate nella
-lista \param{list} che deve contenere gli indirizzi di altrettanti
-\textit{control block} opportunamente inizializzati; in particolare dovrà
-essere specificato il tipo di operazione con il campo \var{aio\_lio\_opcode},
-che può prendere i valori:
+lista \param{list} un vettore di puntatori a strutture \struct{aiocb}
+indicanti le operazioni da compiere (che verranno eseguite senza un ordine
+particolare). La lista può contenere anche puntatori nulli, che saranno
+ignorati (si possono così eliminare facilmente componenti della lista senza
+doverla rigenerare).
+
+Ciascuna struttura \struct{aiocb} della lista deve contenere un
+\textit{control block} opportunamente inizializzato; in particolare per
+ognuna di esse dovrà essere specificato il tipo di operazione con il campo
+\var{aio\_lio\_opcode}, che può prendere i valori:
 \begin{basedescript}{\desclabelwidth{2.0cm}}
 \item[\const{LIO\_READ}]  si richiede una operazione di lettura.
 \item[\const{LIO\_WRITE}] si richiede una operazione di scrittura.
@@ -3841,7 +3855,7 @@ che può prendere i valori:
 dove \const{LIO\_NOP} viene usato quando si ha a che fare con un vettore di
 dimensione fissa, per poter specificare solo alcune operazioni, o quando si
 sono dovute cancellare delle operazioni e si deve ripetere la richiesta per
-quelle non completate.
+quelle non completate. 
 
 L'argomento \param{mode} controlla il comportamento della funzione, se viene
 usato il valore \const{LIO\_WAIT} la funzione si blocca fino al completamento
@@ -3876,9 +3890,9 @@ avanzato.
 \itindbeg{memory~mapping}
 Una modalità alternativa di I/O, che usa una interfaccia completamente diversa
 rispetto a quella classica vista in sez.~\ref{sec:file_unix_interface}, è il
-cosiddetto \textit{memory-mapped I/O}, che, attraverso il meccanismo della
+cosiddetto \textit{memory-mapped I/O}, che attraverso il meccanismo della
 \textsl{paginazione} \index{paginazione} usato dalla memoria virtuale (vedi
-sez.~\ref{sec:proc_mem_gen}), permette di \textsl{mappare} il contenuto di un
+sez.~\ref{sec:proc_mem_gen}) permette di \textsl{mappare} il contenuto di un
 file in una sezione dello spazio di indirizzi del processo che lo ha allocato.
 
 \begin{figure}[htb]
@@ -3893,12 +3907,12 @@ Il meccanismo è illustrato in fig.~\ref{fig:file_mmap_layout}, una sezione del
 file viene \textsl{mappata} direttamente nello spazio degli indirizzi del
 programma.  Tutte le operazioni di lettura e scrittura su variabili contenute
 in questa zona di memoria verranno eseguite leggendo e scrivendo dal contenuto
-del file attraverso il sistema della memoria virtuale \index{memoria~virtuale}
-che in maniera analoga a quanto avviene per le pagine che vengono salvate e
-rilette nella swap, si incaricherà di sincronizzare il contenuto di quel
-segmento di memoria con quello del file mappato su di esso.  Per questo motivo
-si può parlare tanto di \textsl{file mappato in memoria}, quanto di
-\textsl{memoria mappata su file}.
+del file attraverso il sistema della memoria virtuale illustrato in
+sez.~\ref{sec:proc_mem_gen} che in maniera analoga a quanto avviene per le
+pagine che vengono salvate e rilette nella \textit{swap}, si incaricherà di
+sincronizzare il contenuto di quel segmento di memoria con quello del file
+mappato su di esso.  Per questo motivo si può parlare tanto di \textsl{file
+  mappato in memoria}, quanto di \textsl{memoria mappata su file}.
 
 L'uso del \textit{memory-mapping} comporta una notevole semplificazione delle
 operazioni di I/O, in quanto non sarà più necessario utilizzare dei buffer
@@ -3914,64 +3928,73 @@ cui si opera sarà a sua volta letta o scritta sul file una pagina alla volta e
 solo per le parti effettivamente usate, il tutto in maniera completamente
 trasparente al processo; l'accesso alle pagine non ancora caricate avverrà
 allo stesso modo con cui vengono caricate in memoria le pagine che sono state
-salvate sullo swap.
+salvate sullo \textit{swap}.
 
 Infine in situazioni in cui la memoria è scarsa, le pagine che mappano un file
 vengono salvate automaticamente, così come le pagine dei programmi vengono
-scritte sulla swap; questo consente di accedere ai file su dimensioni il cui
-solo limite è quello dello spazio di indirizzi disponibile, e non della
+scritte sulla \textit{swap}; questo consente di accedere ai file su dimensioni
+il cui solo limite è quello dello spazio di indirizzi disponibile, e non della
 memoria su cui possono esserne lette delle porzioni.
 
-L'interfaccia POSIX implementata da Linux prevede varie funzioni per la
-gestione del \textit{memory mapped I/O}, la prima di queste, che serve ad
-eseguire la mappatura in memoria di un file, è \funcd{mmap}; il suo prototipo
-è:
-\begin{functions}
-  
-  \headdecl{unistd.h}
-  \headdecl{sys/mman.h} 
+L'interfaccia POSIX implementata da Linux prevede varie funzioni di sistema
+per la gestione del \textit{memory mapped I/O}, la prima di queste, che serve
+ad eseguire la mappatura in memoria di un file, è \funcd{mmap}; il suo
+prototipo è:
 
-  \funcdecl{void * mmap(void * start, size\_t length, int prot, int flags, int
+\begin{funcproto}{
+\fhead{unistd.h}
+\fhead{sys/mman.h} 
+\fdecl{void * mmap(void * start, size\_t length, int prot, int flags, int
     fd, off\_t offset)}
-  
-  Esegue la mappatura in memoria della sezione specificata del file \param{fd}.
-  
-  \bodydesc{La funzione restituisce il puntatore alla zona di memoria mappata
-    in caso di successo, e \const{MAP\_FAILED} (-1) in caso di errore, nel
-    qual caso \var{errno} assumerà uno dei valori:
-    \begin{errlist}
-    \item[\errcode{EBADF}] il file descriptor non è valido, e non si è usato
-      \const{MAP\_ANONYMOUS}.
+\fdesc{Esegue la mappatura in memoria di una sezione di un file.} 
+}
+
+{La funzione ritorna il puntatore alla zona di memoria mappata in caso di
+  successo, e \const{MAP\_FAILED} (\texttt{(void *) -1}) per un errore, nel
+  qual caso \var{errno} assumerà uno dei valori:
+  \begin{errlist}
     \item[\errcode{EACCES}] o \param{fd} non si riferisce ad un file regolare,
       o si è usato \const{MAP\_PRIVATE} ma \param{fd} non è aperto in lettura,
       o si è usato \const{MAP\_SHARED} e impostato \const{PROT\_WRITE} ed
       \param{fd} non è aperto in lettura/scrittura, o si è impostato
       \const{PROT\_WRITE} ed \param{fd} è in \textit{append-only}.
-    \item[\errcode{EINVAL}] i valori di \param{start}, \param{length} o
-      \param{offset} non sono validi (o troppo grandi o non allineati sulla
-      dimensione delle pagine).
-    \item[\errcode{ETXTBSY}] si è impostato \const{MAP\_DENYWRITE} ma
-      \param{fd} è aperto in scrittura.
     \item[\errcode{EAGAIN}] il file è bloccato, o si è bloccata troppa memoria
       rispetto a quanto consentito dai limiti di sistema (vedi
       sez.~\ref{sec:sys_resource_limit}).
-    \item[\errcode{ENOMEM}] non c'è memoria o si è superato il limite sul
-      numero di mappature possibili.
+    \item[\errcode{EBADF}] il file descriptor non è valido, e non si è usato
+      \const{MAP\_ANONYMOUS}.
+    \item[\errcode{EINVAL}] i valori di \param{start}, \param{length} o
+      \param{offset} non sono validi (o troppo grandi o non allineati sulla
+      dimensione delle pagine), o \param{lengh} è zero (solo dal 2.6.12)
+      o \param{flags} contiene sia \const{MAP\_PRIVATE} che
+      \const{MAP\_SHARED} o nessuno dei due.
+    \item[\errcode{ENFILE}] si è superato il limite del sistema sul numero di
+      file aperti (vedi sez.~\ref{sec:sys_resource_limit}).
     \item[\errcode{ENODEV}] il filesystem di \param{fd} non supporta il memory
       mapping.
+    \item[\errcode{ENOMEM}] non c'è memoria o si è superato il limite sul
+      numero di mappature possibili.
+    \item[\errcode{EOVERFLOW}] su architettura a 32 bit con il supporto per i
+      \textit{large file} (che hanno una dimensione a 64 bit) il numero di
+      pagine usato per \param{lenght} aggiunto a quello usato
+      per \param{offset} eccede i 32 bit (\texttt{unsigned long}).
     \item[\errcode{EPERM}] l'argomento \param{prot} ha richiesto
       \const{PROT\_EXEC}, ma il filesystem di \param{fd} è montato con
       l'opzione \texttt{noexec}.
-    \item[\errcode{ENFILE}] si è superato il limite del sistema sul numero di
-      file aperti (vedi sez.~\ref{sec:sys_resource_limit}).
-    \end{errlist}
-  }
-\end{functions}
+    \item[\errcode{ETXTBSY}] si è impostato \const{MAP\_DENYWRITE} ma
+      \param{fd} è aperto in scrittura.
+  \end{errlist}
+}
+\end{funcproto}
 
 La funzione richiede di mappare in memoria la sezione del file \param{fd} a
 partire da \param{offset} per \param{length} byte, preferibilmente
-all'indirizzo \param{start}. Il valore di \param{offset} deve essere un
-multiplo della dimensione di una pagina di memoria. 
+all'indirizzo \param{start}. Il valore \param{start} viene normalmente
+considerato come un suggerimento, ma l'uso di un qualunque valore diverso da
+\val{NULL}, in cui si rimette completamente al kernel la scelta
+dell'indirizzo, viene sconsigliato per ragioni di portabilità. Il valore
+di \param{offset} deve essere un multiplo della dimensione di una pagina di
+memoria.
 
 \begin{table}[htb]
   \centering
@@ -3994,8 +4017,8 @@ multiplo della dimensione di una pagina di memoria.
 
 Il valore dell'argomento \param{prot} indica la protezione\footnote{come
   accennato in sez.~\ref{sec:proc_memory} in Linux la memoria reale è divisa
-  in pagine: ogni processo vede la sua memoria attraverso uno o più segmenti
-  lineari di memoria virtuale.  Per ciascuno di questi segmenti il kernel
+  in pagine, ogni processo vede la sua memoria attraverso uno o più segmenti
+  lineari di memoria virtuale; per ciascuno di questi segmenti il kernel
   mantiene nella \itindex{page~table} \textit{page table} la mappatura sulle
   pagine di memoria reale, ed le modalità di accesso (lettura, esecuzione,
   scrittura); una loro violazione causa quella una \itindex{segment~violation}
@@ -4020,87 +4043,81 @@ tab.~\ref{tab:file_mmap_flag}.
     \textbf{Valore} & \textbf{Significato} \\
     \hline
     \hline
+    \const{MAP\_32BIT}     & Esegue la mappatura sui primi 2Gb dello spazio
+                             degli indirizzi, viene supportato solo sulle
+                             piattaforme \texttt{x86-64} per compatibilità con
+                             le applicazioni a 32 bit. Viene ignorato se si è
+                             richiesto \const{MAP\_FIXED} (dal 2.4.20).\\
+    \const{MAP\_ANON}      & Sinonimo di \const{MAP\_ANONYMOUS}, deprecato.\\
+    \const{MAP\_ANONYMOUS} & La mappatura non è associata a nessun file. Gli
+                             argomenti \param{fd} e \param{offset} sono
+                             ignorati.\\
+    \const{MAP\_DENYWRITE} & In Linux viene ignorato per evitare
+                             \textit{DoS} \itindex{Denial~of~Service~(DoS)}
+                             (veniva usato per segnalare che tentativi di
+                             scrittura sul file dovevano fallire con
+                             \errcode{ETXTBSY}).\\ 
+    \const{MAP\_EXECUTABLE}& Ignorato.\\
+    \const{MAP\_FILE}      & Valore di compatibilità, ignorato.\\
     \const{MAP\_FIXED}     & Non permette di restituire un indirizzo diverso
                              da \param{start}, se questo non può essere usato
                              \func{mmap} fallisce. Se si imposta questo flag il
                              valore di \param{start} deve essere allineato
                              alle dimensioni di una pagina.\\
-    \const{MAP\_SHARED}    & I cambiamenti sulla memoria mappata vengono
-                             riportati sul file e saranno immediatamente
-                             visibili agli altri processi che mappano lo stesso
-                             file.\footnotemark Il file su disco però non sarà
-                             aggiornato fino alla chiamata di \func{msync} o
-                             \func{munmap}), e solo allora le modifiche saranno
-                             visibili per l'I/O convenzionale. Incompatibile
-                             con \const{MAP\_PRIVATE}.\\ 
+    \const{MAP\_GROWSDOWN} & Usato per gli \itindex{stack} \textit{stack}. 
+                             Indica che la mappatura deve essere effettuata 
+                             con gli indirizzi crescenti verso il basso.\\
+    \const{MAP\_HUGETLB}   & Esegue la mappatura usando le cosiddette
+                             ``\textit{huge pages}'' (dal 2.6.32).\\
+    \const{MAP\_LOCKED}    & Se impostato impedisce lo \textit{swapping} delle
+                             pagine mappate (dal 2.5.37).\\
+    \const{MAP\_NONBLOCK}  & Esegue un \textit{prefaulting} più limitato che
+                             non causa I/O (dal 2.5.46).\\
+    \const{MAP\_NORESERVE} & Si usa con \const{MAP\_PRIVATE}. Non riserva
+                             delle pagine di \textit{swap} ad uso del meccanismo
+                             del \textit{copy on write} \itindex{copy~on~write}
+                             per mantenere le modifiche fatte alla regione
+                             mappata, in questo caso dopo una scrittura, se
+                             non c'è più memoria disponibile, si ha
+                             l'emissione di un \signal{SIGSEGV}.\\
     \const{MAP\_PRIVATE}   & I cambiamenti sulla memoria mappata non vengono
                              riportati sul file. Ne viene fatta una copia
                              privata cui solo il processo chiamante ha
                              accesso.  Le modifiche sono mantenute attraverso
-                             il meccanismo del \textit{copy on
-                               write} \itindex{copy~on~write} e 
-                             salvate su swap in caso di necessità. Non è
+                             il meccanismo del \textit{copy on write} e 
+                             salvate su \textit{swap} in caso di necessità. Non è
                              specificato se i cambiamenti sul file originale
                              vengano riportati sulla regione
                              mappata. Incompatibile con \const{MAP\_SHARED}.\\
-    \const{MAP\_DENYWRITE} & In Linux viene ignorato per evitare
-                             \textit{DoS} \itindex{Denial~of~Service~(DoS)}
-                             (veniva usato per segnalare che tentativi di
-                             scrittura sul file dovevano fallire con
-                             \errcode{ETXTBSY}).\\ 
-    \const{MAP\_EXECUTABLE}& Ignorato.\\
-    \const{MAP\_NORESERVE} & Si usa con \const{MAP\_PRIVATE}. Non riserva
-                             delle pagine di swap ad uso del meccanismo del
-                             \textit{copy on write} \itindex{copy~on~write}
-                             per mantenere le
-                             modifiche fatte alla regione mappata, in
-                             questo caso dopo una scrittura, se non c'è più
-                             memoria disponibile, si ha l'emissione di
-                             un \signal{SIGSEGV}.\\
-    \const{MAP\_LOCKED}    & Se impostato impedisce lo swapping delle pagine
-                             mappate.\\
-    \const{MAP\_GROWSDOWN} & Usato per gli \itindex{stack} \textit{stack}. 
-                             Indica che la mappatura deve essere effettuata 
-                             con gli indirizzi crescenti verso il basso.\\
-    \const{MAP\_ANONYMOUS} & La mappatura non è associata a nessun file. Gli
-                             argomenti \param{fd} e \param{offset} sono
-                             ignorati.\footnotemark\\
-    \const{MAP\_ANON}      & Sinonimo di \const{MAP\_ANONYMOUS}, deprecato.\\
-    \const{MAP\_FILE}      & Valore di compatibilità, ignorato.\\
-    \const{MAP\_32BIT}     & Esegue la mappatura sui primi 2Gb dello spazio
-                             degli indirizzi, viene supportato solo sulle
-                             piattaforme \texttt{x86-64} per compatibilità con
-                             le applicazioni a 32 bit. Viene ignorato se si è
-                             richiesto \const{MAP\_FIXED}.\\
     \const{MAP\_POPULATE}  & Esegue il \itindex{prefaulting}
                              \textit{prefaulting} delle pagine di memoria
-                             necessarie alla mappatura.\\
-    \const{MAP\_NONBLOCK}  & Esegue un \textit{prefaulting} più limitato che
-                             non causa I/O.\footnotemark\\
+                             necessarie alla mappatura (dal 2.5.46).\\
+    \const{MAP\_SHARED}    & I cambiamenti sulla memoria mappata vengono
+                             riportati sul file e saranno immediatamente
+                             visibili agli altri processi che mappano lo stesso
+                             file.\footnotemark Il file su disco però non sarà
+                             aggiornato fino alla chiamata di \func{msync} o
+                             \func{munmap}), e solo allora le modifiche saranno
+                             visibili per l'I/O convenzionale. Incompatibile
+                             con \const{MAP\_PRIVATE}.\\ 
+    \const{MAP\_STACK}     & da trattare (dal 2.6.27).\\
+    \const{MAP\_UNINITIALIZED}& da trattare (dal 2.6.33).\\
 %     \const{MAP\_DONTEXPAND}& Non consente una successiva espansione dell'area
 %                              mappata con \func{mremap}, proposto ma pare non
 %                              implementato.\\
-%     \const{MAP\_HUGETLB}& da trattare.\\
-% TODO trattare MAP_HUGETLB introdotto con il kernel 2.6.32, e modifiche
-% introdotte con il 3.8 per le dimensioni variabili delle huge pages
-
     \hline
   \end{tabular}
   \caption{Valori possibili dell'argomento \param{flag} di \func{mmap}.}
   \label{tab:file_mmap_flag}
 \end{table}
 
-\footnotetext[68]{dato che tutti faranno riferimento alle stesse pagine di
-  memoria.}  
-
-\footnotetext[69]{l'uso di questo flag con \const{MAP\_SHARED} è stato
+\footnotetext{l'uso di questo flag con \const{MAP\_SHARED} è stato
   implementato in Linux a partire dai kernel della serie 2.4.x; esso consente
   di creare segmenti di memoria condivisa e torneremo sul suo utilizzo in
   sez.~\ref{sec:ipc_mmap_anonymous}.}
 
-\footnotetext{questo flag ed il precedente \const{MAP\_POPULATE} sono stati
-  introdotti nel kernel 2.5.46 insieme alla mappatura non lineare di cui
-  parleremo più avanti.}
+% TODO trattare MAP_HUGETLB introdotto con il kernel 2.6.32, e modifiche
+% introdotte con il 3.8 per le dimensioni variabili delle huge pages
 
 Gli effetti dell'accesso ad una zona di memoria mappata su file possono essere
 piuttosto complessi, essi si possono comprendere solo tenendo presente che
@@ -4131,25 +4148,22 @@ effettive del file o della sezione che si vuole mappare.
 Il caso più comune è quello illustrato in fig.~\ref{fig:file_mmap_boundary},
 in cui la sezione di file non rientra nei confini di una pagina: in tal caso
 verrà il file sarà mappato su un segmento di memoria che si estende fino al
-bordo della pagina successiva.
-
-In questo caso è possibile accedere a quella zona di memoria che eccede le
-dimensioni specificate da \param{length}, senza ottenere un \signal{SIGSEGV}
-poiché essa è presente nello spazio di indirizzi del processo, anche se non è
-mappata sul file. Il comportamento del sistema è quello di restituire un
-valore nullo per quanto viene letto, e di non riportare su file quanto viene
-scritto.
+bordo della pagina successiva.  In questo caso è possibile accedere a quella
+zona di memoria che eccede le dimensioni specificate da \param{length}, senza
+ottenere un \signal{SIGSEGV} poiché essa è presente nello spazio di indirizzi
+del processo, anche se non è mappata sul file. Il comportamento del sistema è
+quello di restituire un valore nullo per quanto viene letto, e di non
+riportare su file quanto viene scritto.
 
 Un caso più complesso è quello che si viene a creare quando le dimensioni del
 file mappato sono più corte delle dimensioni della mappatura, oppure quando il
 file è stato troncato, dopo che è stato mappato, ad una dimensione inferiore a
-quella della mappatura in memoria.
-
-In questa situazione, per la sezione di pagina parzialmente coperta dal
-contenuto del file, vale esattamente quanto visto in precedenza; invece per la
-parte che eccede, fino alle dimensioni date da \param{length}, l'accesso non
-sarà più possibile, ma il segnale emesso non sarà \signal{SIGSEGV}, ma
-\signal{SIGBUS}, come illustrato in fig.~\ref{fig:file_mmap_exceed}.
+quella della mappatura in memoria.  In questa situazione, per la sezione di
+pagina parzialmente coperta dal contenuto del file, vale esattamente quanto
+visto in precedenza; invece per la parte che eccede, fino alle dimensioni date
+da \param{length}, l'accesso non sarà più possibile, ma il segnale emesso non
+sarà \signal{SIGSEGV}, ma \signal{SIGBUS}, come illustrato in
+fig.~\ref{fig:file_mmap_exceed}.
 
 Non tutti i file possono venire mappati in memoria, dato che, come illustrato
 in fig.~\ref{fig:file_mmap_layout}, la mappatura introduce una corrispondenza
@@ -4464,38 +4478,39 @@ partire dal quale la sezione di file indicata verrà rimappata. L'argomento
 valori di \func{mmap} (quelli di tab.~\ref{tab:file_mmap_prot}) ma di tutti i
 flag solo \const{MAP\_NONBLOCK} non viene ignorato.
 
+\itindbeg{prefaulting} 
+
 Insieme alla funzione \func{remap\_file\_pages} nel kernel 2.5.46 con sono
 stati introdotti anche due nuovi flag per \func{mmap}: \const{MAP\_POPULATE} e
 \const{MAP\_NONBLOCK}.  Il primo dei due consente di abilitare il meccanismo
-del \itindex{prefaulting} \textit{prefaulting}. Questo viene di nuovo in aiuto
-per migliorare le prestazioni in certe condizioni di utilizzo del
-\textit{memory mapping}. 
+del \textit{prefaulting}. Questo viene di nuovo in aiuto per migliorare le
+prestazioni in certe condizioni di utilizzo del \textit{memory mapping}.
 
 Il problema si pone tutte le volte che si vuole mappare in memoria un file di
-grosse dimensioni. Il comportamento normale del sistema della
-\index{memoria~virtuale} memoria virtuale è quello per cui la regione mappata
-viene aggiunta alla \itindex{page~table} \textit{page table} del processo, ma
-i dati verranno effettivamente utilizzati (si avrà cioè un
-\itindex{page~fault} \textit{page fault} che li trasferisce dal disco alla
-memoria) soltanto in corrispondenza dell'accesso a ciascuna delle pagine
-interessate dal \textit{memory mapping}. 
+grosse dimensioni. Il comportamento normale del sistema della memoria virtuale
+è quello per cui la regione mappata viene aggiunta alla \textit{page table}
+del processo, ma i dati verranno effettivamente utilizzati (si avrà cioè un
+\textit{page fault} che li trasferisce dal disco alla memoria) soltanto in
+corrispondenza dell'accesso a ciascuna delle pagine interessate dal
+\textit{memory mapping}.
 
 Questo vuol dire che il passaggio dei dati dal disco alla memoria avverrà una
 pagina alla volta con un gran numero di \itindex{page~fault} \textit{page
   fault}, chiaramente se si sa in anticipo che il file verrà utilizzato
-immediatamente, è molto più efficiente eseguire un \itindex{prefaulting}
-\textit{prefaulting} in cui tutte le pagine di memoria interessate alla
-mappatura vengono ``\textsl{popolate}'' in una sola volta, questo
-comportamento viene abilitato quando si usa con \func{mmap} il flag
-\const{MAP\_POPULATE}.
+immediatamente, è molto più efficiente eseguire un \textit{prefaulting} in cui
+tutte le pagine di memoria interessate alla mappatura vengono
+``\textsl{popolate}'' in una sola volta, questo comportamento viene abilitato
+quando si usa con \func{mmap} il flag \const{MAP\_POPULATE}.
 
 Dato che l'uso di \const{MAP\_POPULATE} comporta dell'I/O su disco che può
 rallentare l'esecuzione di \func{mmap} è stato introdotto anche un secondo
-flag, \const{MAP\_NONBLOCK}, che esegue un \itindex{prefaulting}
-\textit{prefaulting} più limitato in cui vengono popolate solo le pagine della
-mappatura che già si trovano nella cache del kernel.\footnote{questo può
-  essere utile per il linker dinamico, in particolare quando viene effettuato
-  il \textit{prelink} delle applicazioni.}
+flag, \const{MAP\_NONBLOCK}, che esegue un \textit{prefaulting} più limitato
+in cui vengono popolate solo le pagine della mappatura che già si trovano
+nella cache del kernel.\footnote{questo può essere utile per il linker
+  dinamico, in particolare quando viene effettuato il \textit{prelink} delle
+  applicazioni.}
+
+\itindend{prefaulting}
 
 Per i vantaggi illustrati all'inizio del paragrafo l'interfaccia del
 \textit{memory mapped I/O} viene usata da una grande varietà di programmi,
@@ -5368,11 +5383,10 @@ all'accesso al disco; il suo prototipo è:
 
 La funzione richiede che venga letto in anticipo il contenuto del file
 \param{fd} a partire dalla posizione \param{offset} e per un ammontare di
-\param{count} byte, in modo da portarlo in cache.  La funzione usa la
-\index{memoria~virtuale} memoria virtuale ed il meccanismo della
-\index{paginazione} paginazione per cui la lettura viene eseguita in blocchi
-corrispondenti alle dimensioni delle pagine di memoria, ed i valori di
-\param{offset} e \param{count} vengono arrotondati di conseguenza.
+\param{count} byte, in modo da portarlo in cache.  La funzione usa la memoria
+virtuale ed il meccanismo della paginazione per cui la lettura viene eseguita
+in blocchi corrispondenti alle dimensioni delle pagine di memoria, ed i valori
+di \param{offset} e \param{count} vengono arrotondati di conseguenza.
 
 La funzione estende quello che è un comportamento normale del kernel che
 quando si legge un file, aspettandosi che l'accesso prosegua, esegue sempre
@@ -5627,7 +5641,8 @@ livello di kernel.
 % http://kernelnewbies.org/Linux_2_6_23
 
 % TODO aggiungere FALLOC_FL_ZERO_RANGE e FALLOC_FL_COLLAPSE_RANGE, inseriti
-% nel kenrel 3.15 (sul secondo vedi http://lwn.net/Articles/589260/)
+% nel kernel 3.15 (sul secondo vedi http://lwn.net/Articles/589260/), vedi
+% anche http://lwn.net/Articles/629965/
 
 % TODO non so dove trattarli, ma dal 2.6.39 ci sono i file handle, vedi
 % http://lwn.net/Articles/432757/