From 56e0976f3b730fc36d0dffad73e1be91dbe5dcda Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Wed, 5 Sep 2018 00:28:01 +0200 Subject: [PATCH] Uniformato "user space" in italic e corrette alcune parti degli extended attributes. --- filedir.tex | 148 +++++++++++++++++++++++++++----------------------- intro.tex | 2 +- ipc.tex | 2 +- othersock.tex | 4 +- process.tex | 15 ++--- signal.tex | 8 +-- sockctrl.tex | 14 ++--- socket.tex | 4 +- 8 files changed, 105 insertions(+), 92 deletions(-) diff --git a/filedir.tex b/filedir.tex index b78f99b..58aa44d 100644 --- a/filedir.tex +++ b/filedir.tex @@ -4908,12 +4908,13 @@ trovare spazio nei dati classici mantenuti negli \textit{inode}. Per risolvere questo problema alcuni sistemi unix-like (e fra questi anche Linux) hanno introdotto un meccanismo generico, detto \textit{Extended Attributes} che consente di associare delle informazioni ulteriori ai -singoli file.\footnote{essi ad esempio vengono usati per le ACL, che - tratteremo in sez.~\ref{sec:file_ACL} e le \textit{file capabilities}, che - vedremo in sez.~\ref{sec:proc_capabilities}.} Gli \textsl{attributi estesi} -non sono altro che delle coppie nome/valore che sono associate permanentemente -ad un oggetto sul filesystem, analoghi di quello che sono le variabili di -ambiente (vedi sez.~\ref{sec:proc_environ}) per un processo. +singoli file; ad esempio vengono usati per la gestione delle ACL, che +tratteremo in sez.~\ref{sec:file_ACL} e per le \textit{file capabilities}, che +vedremo in sez.~\ref{sec:proc_capabilities}. Gli \textsl{attributi estesi} +(abbreviati in \textsl{xattr}) non sono altro che delle coppie nome/valore che +sono associate permanentemente ad un oggetto sul filesystem, analoghi di +quello che sono le variabili di ambiente (vedi sez.~\ref{sec:proc_environ}) +per un processo. Altri sistemi (come Solaris, MacOS e Windows) hanno adottato un meccanismo diverso in cui ad un file sono associati diversi flussi di dati, su cui @@ -4935,18 +4936,20 @@ che ogni valore precedente sia sovrascritto. Si tenga presente che non tutti i filesystem supportano gli \textit{Extended Attributes}; al momento della scrittura di queste dispense essi sono presenti solo sui vari \textsl{extN}, \textsl{ReiserFS}, \textsl{JFS}, -\textsl{XFS} e \textsl{Btrfs}.\footnote{l'elenco è aggiornato a Luglio 2011.} -Inoltre a seconda della implementazione ci possono essere dei limiti sulla -quantità di attributi che si possono utilizzare.\footnote{ad esempio nel caso - di \textsl{ext2} ed \textsl{ext3} è richiesto che essi siano contenuti +\textsl{XFS}, \textsl{Btrfs}, \textsl{Lustre} e \textsl{OCFS2}. Inoltre a +seconda della implementazione ci possono essere dei limiti sulla quantità di +attributi che si possono utilizzare.\footnote{ad esempio nel caso di + \textsl{ext2} ed \textsl{ext3} è richiesto che essi siano contenuti all'interno di un singolo blocco, pertanto con dimensioni massime pari a 1024, 2048 o 4096 byte a seconda delle dimensioni di quest'ultimo impostate - in fase di creazione del filesystem, mentre con \textsl{XFS} non ci sono - limiti ed i dati vengono memorizzati in maniera diversa (nell'\textit{inode} - stesso, in un blocco a parte, o in una struttura ad albero dedicata) per - mantenerne la scalabilità.} Infine lo spazio utilizzato per mantenere gli -attributi estesi viene tenuto in conto per il calcolo delle quote di utente e -gruppo proprietari del file. + in fase di creazione del filesystem, mentre con \textsl{XFS} e + \textsl{Btrfs} non ci sono limiti ed i dati vengono memorizzati in maniera + diversa (nell'\textit{inode} stesso, in un blocco a parte, o in una + struttura ad albero dedicata) per mantenerne la scalabilità; lasciamo i + dettagli dei vari filesystem alla documentazione accessibile con \texttt{man + xattr}.} Infine lo spazio utilizzato per mantenere gli attributi estesi +viene tenuto in conto per il calcolo delle quote di utente e gruppo +proprietari del file. Come meccanismo per mantenere informazioni aggiuntive associate al singolo file, gli \textit{Extended Attributes} possono avere usi anche molto diversi @@ -4956,9 +4959,9 @@ gestione. Per questo motivo il nome di un attributo deve essere sempre specificato nella forma \texttt{namespace.attribute}, dove \texttt{namespace} fa riferimento alla classe a cui l'attributo appartiene, mentre \texttt{attribute} è il nome ad esso assegnato. In tale forma il nome di un -attributo esteso deve essere univoco. Al momento\footnote{della scrittura di - questa sezione, kernel 2.6.23, ottobre 2007.} sono state definite le quattro -classi di attributi riportate in tab.~\ref{tab:extended_attribute_class}. +attributo esteso deve essere univoco. Al momento sono state definite le +quattro classi di attributi riportate in +tab.~\ref{tab:extended_attribute_class}. \begin{table}[htb] \centering @@ -4974,13 +4977,13 @@ classi di attributi riportate in tab.~\ref{tab:extended_attribute_class}. di meccanismi evoluti di controllo di accesso come \textit{SELinux} o le \textit{capabilities} dei file di sez.~\ref{sec:proc_capabilities}.\\ - \texttt{system} & Gli \textit{extended security attributes}: sono usati + \texttt{system} & Gli \textit{extended system attributes}: sono usati dal kernel per memorizzare dati di sistema associati ai file come le ACL (vedi sez.~\ref{sec:file_ACL}) o le \textit{capabilities} (vedi sez.~\ref{sec:proc_capabilities}).\\ \texttt{trusted}& I \textit{trusted extended attributes}: vengono - utilizzati per poter realizzare in user space + utilizzati per poter realizzare in \textit{user space} meccanismi che consentano di mantenere delle informazioni sui file che non devono essere accessibili ai processi ordinari.\\ @@ -4997,8 +5000,8 @@ classi di attributi riportate in tab.~\ref{tab:extended_attribute_class}. Dato che uno degli usi degli \textit{Extended Attributes} è di impiegarli per -realizzare delle estensioni (come le ACL, \textit{SELinux}, ecc.) al -tradizionale meccanismo dei controlli di accesso di Unix, l'accesso ai loro +realizzare delle estensioni al tradizionale meccanismo dei controlli di +accesso di Unix (come le ACL, \textit{SELinux}, ecc.), l'accesso ai loro valori viene regolato in maniera diversa a seconda sia della loro classe che di quali, fra le estensioni che li utilizzano, sono poste in uso. In particolare, per ciascuna delle classi riportate in @@ -5012,8 +5015,8 @@ tab.~\ref{tab:extended_attribute_class}, si hanno i seguenti casi: modulo di sicurezza che si sta utilizzando al momento (ciascuno avrà le sue). Se non è stato caricato nessun modulo di sicurezza l'accesso in lettura sarà consentito a tutti i processi, mentre quello in scrittura solo - ai processi con privilegi amministrativi dotati della capacità - \const{CAP\_SYS\_ADMIN}. + ai processi con privilegi amministrativi (per la precisione dotati della + capacità \const{CAP\_SYS\_ADMIN}, vedi sez.~\ref{sec:proc_capabilities}). \item[\texttt{system}] Anche l'accesso agli \textit{extended system attributes} dipende dalle politiche di accesso che il kernel realizza @@ -5022,15 +5025,15 @@ tab.~\ref{tab:extended_attribute_class}, si hanno i seguenti casi: ai processi che hanno la capacità di eseguire una ricerca sul file (cioè hanno il permesso di lettura sulla directory che contiene il file) ed in scrittura al proprietario del file o ai processi dotati della capacità - \const{CAP\_FOWNER}.\footnote{vale a dire una politica di accesso analoga a - quella impiegata per gli ordinari permessi dei file.} + \const{CAP\_FOWNER}, vale a dire una politica di accesso analoga a quella + impiegata per gli ordinari permessi dei file. \item[\texttt{trusted}] L'accesso ai \textit{trusted extended attributes}, sia per la lettura che per la scrittura, è consentito soltanto ai processi con privilegi amministrativi dotati della capacità \const{CAP\_SYS\_ADMIN}. In - questo modo si possono utilizzare questi attributi per realizzare in user - space dei meccanismi di controllo che accedono ad informazioni non - disponibili ai processi ordinari. + questo modo si possono utilizzare questi attributi per realizzare in + \textit{user space} dei meccanismi di controllo che accedono ad informazioni + non disponibili ai processi ordinari. \item[\texttt{user}] L'accesso agli \textit{extended user attributes} è regolato dai normali permessi dei file: occorre avere il permesso di lettura @@ -5057,9 +5060,9 @@ tab.~\ref{tab:extended_attribute_class}, si hanno i seguenti casi: due casi hanno a che fare con il contenuto del file, e nella discussione relativa all'uso degli \textit{extended user attributes} nessuno è mai stato capace di indicare una qualche forma sensata di utilizzo degli stessi per - collegamenti simbolici o file di dispositivo, e neanche per le \textit{fifo} o i - socket. Per questo motivo essi sono stati completamente disabilitati per - tutto ciò che non sia un file regolare o una directory.\footnote{si può + collegamenti simbolici o file di dispositivo, e neanche per le \textit{fifo} + o i socket. Per questo motivo essi sono stati completamente disabilitati + per tutto ciò che non sia un file regolare o una directory.\footnote{si può verificare la semantica adottata consultando il file \texttt{fs/xattr.c} dei sorgenti del kernel.} Inoltre per le directory è stata introdotta una ulteriore restrizione, dovuta di nuovo alla presenza ordinaria di permessi @@ -5124,35 +5127,41 @@ il nome dell'attributo di cui si vuole ottenere il valore. Il nome deve essere indicato comprensivo di prefisso del \textit{namespace} cui appartiene (uno dei valori di tab.~\ref{tab:extended_attribute_class}) nella forma \texttt{namespace.attributename}, come stringa terminata da un carattere NUL. -Il suo valore verrà restituito nel buffer puntato dall'argomento \param{value} -per una dimensione massima di \param{size} byte;\footnote{gli attributi estesi - possono essere costituiti arbitrariamente da dati testuali o binari.} se -quest'ultima non è sufficiente si avrà un errore di \errcode{ERANGE}. +Il valore dell'attributo richiesto verrà restituito nel buffer puntato +dall'argomento \param{value} per una dimensione massima di \param{size} byte +(gli attributi estesi possono essere costituiti arbitrariamente da dati +testuali o binari); se quest'ultima non è sufficiente si avrà un errore di +\errcode{ERANGE}. Per evitare di dover indovinare la dimensione di un attributo per tentativi si può eseguire una interrogazione utilizzando un valore nullo per \param{size}; in questo caso non verrà letto nessun dato, ma verrà restituito come valore di ritorno della funzione chiamata la dimensione totale dell'attributo esteso richiesto, che si potrà usare come stima per allocare un buffer di dimensioni -sufficienti.\footnote{si parla di stima perché anche se le funzioni - restituiscono la dimensione esatta dell'attributo al momento in cui sono - eseguite, questa potrebbe essere modificata in qualunque momento da un - successivo accesso eseguito da un altro processo.} +sufficienti. -Un secondo gruppo di funzioni è quello che consente di impostare il valore di -un attributo esteso, queste sono \funcd{setxattr}, \funcd{lsetxattr} e -\funcd{fsetxattr}, e consentono di operare rispettivamente su un file, su un -collegamento simbolico o specificando un file descriptor; i loro prototipi sono: +Si tenga conto che questa è comunque una stima perché anche se le funzioni +restituiscono la dimensione esatta dell'attributo al momento in cui sono +eseguite, questa potrebbe essere modificata in qualunque momento da un +successivo accesso eseguito da un altro processo, pertanto si verifichi sempre +il valore di ritorni ed il codice di errore della funzione usata, senza dare +per scontato che essa abbia sempre successo. + +Un secondo gruppo di funzioni sono quelle che consentono di impostare il +valore di un attributo esteso, le funzioni sono \funcd{setxattr}, +\funcd{lsetxattr} e \funcd{fsetxattr} e consentono di operare rispettivamente +su un file, su un collegamento simbolico o utilizzando un file descriptor; i +rispettivi prototipi sono: \begin{funcproto}{ \fhead{sys/types.h} \fhead{attr/xattr.h} -\fdecl{int setxattr(const char *path, const char *name, const void *value, - size\_t size, int flags)} -\fdecl{int lsetxattr(const char *path, const char *name, const void *value, - size\_t size, int flags)} -\fdecl{int fsetxattr(int filedes, const char *name, const void *value, size\_t - size, int flags)} +\fdecl{int setxattr(const char *path, const char *name, const void *value,\\ + \phantom{int setxattr(}size\_t size, int flags)} +\fdecl{int lsetxattr(const char *path, const char *name, const void *value,\\ + \phantom{int lsetxattr(}size\_t size, int flags)} +\fdecl{int fsetxattr(int filedes, const char *name, const void *value,\\ + \phantom{int fsetxattr(}size\_t size, int flags)} \fdesc{Impostano il valore di un attributo esteso.} } @@ -5171,28 +5180,31 @@ collegamento simbolico o specificando un file descriptor; i loro prototipi sono: permessi di accesso all'attributo.} \end{funcproto} -Le tre funzioni prendono come primo argomento un valore adeguato al loro -scopo, usato in maniera del tutto identica a quanto visto in precedenza per le -analoghe che leggono gli attributi estesi. Il secondo argomento \param{name} -deve indicare, anche in questo caso con gli stessi criteri appena visti per le +Le tre funzioni prendono come primo argomento un valore adeguato al loro scopo +(un \textit{pathname} le prime due, un file descriptor la terza), usato in +maniera del tutto identica a quanto visto in precedenza per le analoghe che +leggono gli attributi estesi. Il secondo argomento, \param{name}, deve +indicare, anche in questo caso con gli stessi criteri appena visti per le analoghe \func{getxattr}, \func{lgetxattr} e \func{fgetxattr}, il nome -(completo di suffisso) dell'attributo su cui si vuole operare. - -Il valore che verrà assegnato all'attributo dovrà essere preparato nel buffer -puntato da \param{value}, e la sua dimensione totale (in byte) sarà indicata -dall'argomento \param{size}. Infine l'argomento \param{flag} consente di -controllare le modalità di sovrascrittura dell'attributo esteso, esso può -prendere due valori: con \constd{XATTR\_REPLACE} si richiede che l'attributo -esista, nel qual caso verrà sovrascritto, altrimenti si avrà errore, mentre -con \constd{XATTR\_CREATE} si richiede che l'attributo non esista, nel qual -caso verrà creato, altrimenti si avrà errore ed il valore attuale non sarà +(completo di suffisso) dell'attributo su cui si vuole operare. Il valore che +verrà assegnato all'attributo dovrà essere preparato nel buffer puntato da +\param{value}, e la sua dimensione totale (in byte) dovrà essere indicata +dall'argomento \param{size}. + +Infine l'argomento \param{flag} consente di controllare le modalità di +sovrascrittura dell'attributo esteso, esso può prendere due valori: con +\constd{XATTR\_REPLACE} si richiede che l'attributo esista, nel qual caso +verrà sovrascritto, altrimenti si avrà errore, mentre con +\constd{XATTR\_CREATE} si richiede che l'attributo non esista, nel qual caso +verrà creato, altrimenti si avrà errore ed il valore attuale non sarà modificato. Utilizzando per \param{flag} un valore nullo l'attributo verrà modificato se è già presente, o creato se non c'è. Le funzioni finora illustrate permettono di leggere o scrivere gli attributi -estesi, ma sarebbe altrettanto utile poter vedere quali sono gli attributi -presenti; a questo provvedono le funzioni di sistema \funcd{listxattr}, -\funcd{llistxattr} e \funcd{flistxattr} i cui prototipi sono: +estesi presenti su un file, ma sarebbe altrettanto utile poter sapere quali +sono questi attributi; per questo sono disponibili le ulteriori tre funzioni +di sistema \funcd{listxattr}, \funcd{llistxattr} e \funcd{flistxattr} i cui +prototipi sono: \begin{funcproto}{ \fhead{sys/types.h} diff --git a/intro.tex b/intro.tex index 82a172d..bf872b8 100644 --- a/intro.tex +++ b/intro.tex @@ -702,7 +702,7 @@ file) da parte del kernel,\footnote{non è così ad esempio nel filesystem HFS file con gli \textit{extended attributes} (vedi sez.~\ref{sec:file_xattr}), ma è una caratteristica tutt'ora poco utilizzata, dato che non corrisponde al modello classico dei file in un sistema Unix.} ogni classificazione di -questo tipo avviene sempre in \textit{user-space}. Gli unici file di cui il +questo tipo avviene sempre in \textit{user space}. Gli unici file di cui il kernel deve essere in grado di capire il contenuto sono i binari dei programmi, per i quali sono supportati solo alcuni formati, anche se oggi viene usato quasi esclusivamente diff --git a/ipc.tex b/ipc.tex index b9c7ee7..f412427 100644 --- a/ipc.tex +++ b/ipc.tex @@ -1397,7 +1397,7 @@ riguarda gli altri campi invece: % primo e ultimo messaggio sono inizializzati a \val{NULL} e % \var{msg\_cbytes}, che esprime la dimensione in byte dei messaggi presenti è % inizializzato a zero. Questi campi sono ad uso interno dell'implementazione -% e non devono essere utilizzati da programmi in user space). +% e non devono essere utilizzati da programmi in \textit{user space}). \end{itemize*} Una volta creata una coda di messaggi le operazioni di controllo vengono diff --git a/othersock.tex b/othersock.tex index a2d3c3f..de8c3d1 100644 --- a/othersock.tex +++ b/othersock.tex @@ -737,8 +737,8 @@ con UDP non esiste una connessione, e fintanto che non si invia un pacchetto non c'è traffico sulla rete. In questo caso l'errore sarà rilevato alla ricezione del pacchetto ICMP \textit{destination unreachable} emesso dalla macchina cui ci si è rivolti, e questa volta, essendo il socket UDP connesso, -il kernel potrà riportare detto errore in user space in maniera non ambigua, -ed esso apparirà alla successiva lettura sul socket. +il kernel potrà riportare detto errore in \textit{user space} in maniera non +ambigua, ed esso apparirà alla successiva lettura sul socket. Si tenga presente infine che l'uso dei socket connessi non risolve l'altro problema del client, e cioè il fatto che in caso di perdita di un pacchetto diff --git a/process.tex b/process.tex index f57e120..0e5641d 100644 --- a/process.tex +++ b/process.tex @@ -1494,13 +1494,14 @@ espressi dalle costanti riportate in tab.~\ref{tab:mlockall_flags}. Con \func{mlockall} si possono bloccare tutte le pagine mappate nello spazio di indirizzi del processo, sia che comprendano il segmento di testo, di dati, lo \textit{stack}, lo \textit{heap} e pure le funzioni di libreria chiamate, i -file mappati in memoria, i dati del kernel mappati in user space, la memoria -condivisa. L'uso dell'argomento \param{flags} permette di selezionare con -maggior finezza le pagine da bloccare, ad esempio usando \const{MCL\_FUTURE} -ci si può limitare a tutte le pagine allocate a partire dalla chiamata della -funzione, mentre \const{MCL\_CURRENT} blocca tutte quelle correntemente -mappate. L'uso di \func{munlockall} invece sblocca sempre tutte le pagine di -memoria correntemente mappate nello spazio di indirizzi del programma. +file mappati in memoria, i dati del kernel mappati in \textit{user space}, la +memoria condivisa. L'uso dell'argomento \param{flags} permette di selezionare +con maggior finezza le pagine da bloccare, ad esempio usando +\const{MCL\_FUTURE} ci si può limitare a tutte le pagine allocate a partire +dalla chiamata della funzione, mentre \const{MCL\_CURRENT} blocca tutte quelle +correntemente mappate. L'uso di \func{munlockall} invece sblocca sempre tutte +le pagine di memoria correntemente mappate nello spazio di indirizzi del +programma. A partire dal kernel 4.4 alla funzione \func{mlockall} è stato aggiunto un altro flag, \const{MCL\_ONFAULT}, che può essere abbinato a entrambi gli altri diff --git a/signal.tex b/signal.tex index 951d723..ec3be9d 100644 --- a/signal.tex +++ b/signal.tex @@ -1333,11 +1333,11 @@ processo tre diversi timer: corrisponde al \textit{clock time}). La scadenza di questo timer provoca l'emissione di \signal{SIGALRM}; \item un \textit{virtual timer} che calcola il tempo di processore usato dal - processo in user space (che corrisponde all'\textit{user time}). La scadenza - di questo timer provoca l'emissione di \signal{SIGVTALRM}; + processo in \textit{user space} (che corrisponde all'\textit{user time}). La + scadenza di questo timer provoca l'emissione di \signal{SIGVTALRM}; \item un \textit{profiling timer} che calcola la somma dei tempi di processore - utilizzati direttamente dal processo in user space, e dal kernel nelle - \textit{system call} ad esso relative (che corrisponde a quello che in + utilizzati direttamente dal processo in \textit{user space}, e dal kernel + nelle \textit{system call} ad esso relative (che corrisponde a quello che in sez.~\ref{sec:sys_unix_time} abbiamo chiamato \textit{processor time}). La scadenza di questo timer provoca l'emissione di \signal{SIGPROF}. \end{itemize*} diff --git a/sockctrl.tex b/sockctrl.tex index e613dc5..6cafe13 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -2352,12 +2352,12 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: L'opzione utilizza per \param{optval} un intero usato come valore logico. Quando viene abilitata gli errori riportati da messaggi ICMP per un socket - UDP non vengono passati al programma in user space. Con le versioni 2.0.x - del kernel erano anche abilitate altre opzioni di compatibilità per i socket - raw (modifiche casuali agli header, perdita del flag di \textit{broadcast}) - che sono state rimosse con il passaggio al 2.2; è consigliato correggere i - programmi piuttosto che usare questa funzione. Dal kernel 2.4 viene - ignorata, e dal 2.6 genera un messaggio di log del kernel. + UDP non vengono passati al programma in \textit{user space}. Con le versioni + 2.0.x del kernel erano anche abilitate altre opzioni di compatibilità per i + socket raw (modifiche casuali agli header, perdita del flag di + \textit{broadcast}) che sono state rimosse con il passaggio al 2.2; è + consigliato correggere i programmi piuttosto che usare questa funzione. Dal + kernel 2.4 viene ignorata, e dal 2.6 genera un messaggio di log del kernel. \item[\constd{SO\_BUSY\_POLL}] questa opzione, presente dal kernel 3.11, imposta un tempo approssimato in microsecondi, per cui in caso di ricezione @@ -3804,7 +3804,7 @@ quantità di dettagli è fornita nel seguente elenco: \item[\constd{TCP\_INFO}] questa opzione, specifica di Linux, ma introdotta anche in altri kernel (ad esempio FreeBSD) permette di controllare lo stato - interno di un socket TCP direttamente da un programma in user space. + interno di un socket TCP direttamente da un programma in \textit{user space}. L'opzione restituisce in una speciale struttura \struct{tcp\_info}, la cui definizione è riportata in fig.~\ref{fig:tcp_info_struct}, tutta una serie di dati che il kernel mantiene, relativi al socket. Anche questa opzione diff --git a/socket.tex b/socket.tex index c127c97..78be58c 100644 --- a/socket.tex +++ b/socket.tex @@ -735,8 +735,8 @@ I \textit{packet socket}, identificati dal dominio \const{AF\_PACKET}, sono un'interfaccia specifica di Linux per inviare e ricevere pacchetti direttamente su un'interfaccia di rete, senza passare per le funzioni di gestione dei protocolli di livello superiore. In questo modo è possibile -implementare dei protocolli in user space, agendo direttamente sul livello -fisico. In genere comunque si preferisce usare la libreria +implementare dei protocolli in \textit{user space}, agendo direttamente sul +livello fisico. In genere comunque si preferisce usare la libreria \file{pcap},\footnote{la libreria è mantenuta insieme al comando \cmd{tcpdump}, informazioni e documentazione si possono trovare sul sito del progetto \url{http://www.tcpdump.org/}.} che assicura la portabilità su -- 2.30.2