}
{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,
\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}.
}
\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
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
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