Revisionati gli errori di mmap e risistemate alcune indicizzazioni (ed
[gapil.git] / fileadv.tex
index bd3063a0e2d5d3fd16cf3040265b6a690ed241cf..e5313642070f22b19db1e8308888fe2eaf70ae52 100644 (file)
@@ -3950,8 +3950,8 @@ prototipo è:
 }
 
 {La funzione ritorna il puntatore alla zona di memoria mappata in caso di
-  successo, e \const{MAP\_FAILED} ($-1$) per un errore, nel qual caso
-  \var{errno} assumerà uno dei valori:
+  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,
@@ -3965,13 +3965,19 @@ prototipo è:
       \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).
+      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}.
@@ -3981,14 +3987,14 @@ prototipo è:
 }
 \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 \param{start} viene normalmente
-considerato come un suggerimento, ma l'uso di un 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.
+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
@@ -4063,13 +4069,13 @@ tab.~\ref{tab:file_mmap_flag}.
                              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\_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}
+                             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
@@ -4142,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