X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;ds=sidebyside;f=fileadv.tex;h=e5313642070f22b19db1e8308888fe2eaf70ae52;hb=936ae71ad2a06b154b23470ef38f477af32e67fe;hp=bd3063a0e2d5d3fd16cf3040265b6a690ed241cf;hpb=45e080607c5b618a11038a6afc9f79af9931b2da;p=gapil.git diff --git a/fileadv.tex b/fileadv.tex index bd3063a..e531364 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -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