Ulteriori revisioni, finita l'introduzione con vari spostamenti e
[gapil.git] / prochand.tex
index e3aa1e0152cf5cbf79b658f9f78bd5ecad1c940a..7e882abcd86f9ebdc60a8a247c572a1ebe8160e0 100644 (file)
@@ -136,9 +136,8 @@ struttura delle principali informazioni contenute nella \struct{task\_struct}
 (che in seguito incontreremo a più riprese), è mostrato in
 fig.~\ref{fig:proc_task_struct}.
 
-\begin{figure}[htb]
-  \centering
-  \includegraphics[width=14cm]{img/task_struct}
+\begin{figure}[!htb]
+  \centering \includegraphics[width=14cm]{img/task_struct}
   \caption{Schema semplificato dell'architettura delle strutture usate dal
     kernel nella gestione dei processi.}
   \label{fig:proc_task_struct}
@@ -310,9 +309,9 @@ affrontato in dettaglio in sez.~\ref{sec:proc_perms}.
 La funzione \funcd{fork} è la funzione fondamentale della gestione dei
 processi: come si è detto tradizionalmente l'unico modo di creare un nuovo
 processo era attraverso l'uso di questa funzione,\footnote{in realtà oggi la
-  system call usata più comunemente da Linux per creare nuovi processi è
-  \func{clone} (vedi \ref{sec:process_clone}) , anche perché a partire dalle
-  \acr{glibc} 2.3.3 non viene più usata la system call originale, ma la stessa
+  \textit{system call} usata da Linux per creare nuovi processi è \func{clone}
+  (vedi \ref{sec:process_clone}), anche perché a partire dalle \acr{glibc}
+  2.3.3 non viene più usata la \textit{system call} originale, ma la stessa
   \func{fork} viene implementata tramite \func{clone}, cosa che consente una
   migliore interazione coi \textit{thread}.} essa quindi riveste un ruolo
 centrale tutte le volte che si devono scrivere programmi che usano il
@@ -372,9 +371,9 @@ sempre un solo padre (il cui \acr{pid} può sempre essere ottenuto con
 \func{getppid}, vedi sez.~\ref{sec:proc_pid}) per cui si usa il valore nullo,
 che non è il \acr{pid} di nessun processo.
 
-\begin{figure}[!htb]
+\begin{figure}[!htbp]
   \footnotesize \centering
-  \begin{minipage}[c]{15cm}
+  \begin{minipage}[c]{\codesamplewidth}
   \includecodesample{listati/ForkTest.c}
   \end{minipage}
   \normalsize
@@ -693,8 +692,8 @@ venne introdotta in BSD per migliorare le prestazioni.
 
 Dato che Linux supporta il \itindex{copy~on~write} \textit{copy on write} la
 perdita di prestazioni è assolutamente trascurabile, e l'uso di questa
-funzione, che resta un caso speciale della system call \func{clone} (che
-tratteremo in dettaglio in sez.~\ref{sec:process_clone}) è deprecato; per
+funzione, che resta un caso speciale della \textit{system call} \func{clone}
+(che tratteremo in dettaglio in sez.~\ref{sec:process_clone}) è deprecato; per
 questo eviteremo di trattarla ulteriormente.
 
 
@@ -983,9 +982,9 @@ deve essere specificato come maschera binaria dei flag riportati nella prima
 parte in tab.~\ref{tab:proc_waitpid_options} che possono essere combinati fra
 loro con un OR aritmetico. Nella seconda parte della stessa tabella si sono
 riportati anche alcuni valori non standard specifici di Linux, che consentono
-un controllo più dettagliato per i processi creati con la system call generica
-\func{clone} (vedi sez.~\ref{sec:process_clone}) usati principalmente per la
-gestione della terminazione dei \itindex{thread} \textit{thread} (vedi
+un controllo più dettagliato per i processi creati con la \textit{system call}
+generica \func{clone} (vedi sez.~\ref{sec:process_clone}) usati principalmente
+per la gestione della terminazione dei \itindex{thread} \textit{thread} (vedi
 sez.~\ref{sec:thread_xxx}).
 
 \begin{table}[!htb]
@@ -1002,9 +1001,10 @@ sez.~\ref{sec:thread_xxx}).
     \const{WCONTINUED}& Ritorna anche quando un processo figlio che era stato
                         fermato ha ripreso l'esecuzione.\footnotemark \\
     \hline
-    \const{\_\_WCLONE}& Attende solo per i figli creati con \func{clone},
-                        vale a dire processi che non emettono nessun segnale
-                        o emettono un segnale diverso da \const{SIGCHL} alla
+    \const{\_\_WCLONE}& Attende solo per i figli creati con \func{clone} 
+                        (vedi sez.~\ref{sec:process_clone}), vale a dire
+                        processi che non emettono nessun segnale 
+                        o emettono un segnale diverso da \const{SIGCHLD} alla
                         terminazione. \\
     \const{\_\_WALL}  & Attende per qualunque processo figlio. \\
     \const{\_\_WNOTHREAD}& Non attende per i figli di altri \textit{thread}
@@ -1455,9 +1455,8 @@ Le altre quattro funzioni si limitano invece a cercare di eseguire il file
 indicato dall'argomento \param{path}, che viene interpretato come il
 \itindex{pathname} \textit{pathname} del programma.
 
-\begin{figure}[htb]
-  \centering
-  \includegraphics[width=12cm]{img/exec_rel}
+\begin{figure}[!htb]
+  \centering \includegraphics[width=12cm]{img/exec_rel}
   \caption{La interrelazione fra le sei funzioni della famiglia \func{exec}.}
   \label{fig:proc_exec_relat}
 \end{figure}
@@ -2693,9 +2692,9 @@ priorità statica da assegnare al processo; lo standard prevede che questo
 debba essere assegnato all'interno di un intervallo fra un massimo ed un
 minimo che nel caso di Linux sono rispettivamente 1 e 99.  
 
-\begin{figure}[!bht]
+\begin{figure}[!htbp]
   \footnotesize \centering
-  \begin{minipage}[c]{15cm}
+  \begin{minipage}[c]{\textwidth}
     \includestruct{listati/sched_param.c}
   \end{minipage} 
   \normalsize 
@@ -3109,7 +3108,7 @@ di I/O.\footnote{se usate in corrispondenza ad uno scheduler diverso il loro
   utilizzo non avrà alcun effetto.} Dato che non esiste una interfaccia
 diretta nelle \acr{glibc} per queste due funzioni occorrerà invocarle tramite
 la funzione \func{syscall} (come illustrato in
-sez.~\ref{sec:intro_syscall}). Le due funzioni sono \funcd{ioprio\_get} ed
+sez.~\ref{sec:proc_syscall}). Le due funzioni sono \funcd{ioprio\_get} ed
 \funcd{ioprio\_set}; i rispettivi prototipi sono:
 \begin{functions}
   \headdecl{linux/ioprio.h}
@@ -3288,15 +3287,164 @@ Nelle precedenti sezioni si sono trattate la gran parte delle funzioni che
 attengono alla gestione ordinaria dei processi e delle loro proprietà più
 comuni. Tratteremo qui alcune \textit{system call} dedicate alla gestione di
 funzionalità dei processi molto specifiche ed avanzate, il cui uso è in genere
-piuttosto ridotto. Trattandosi di problematiche relativamente complesse, che
-spesso presuppongono la conoscenza di altri argomenti trattati più avanti
-nella guida, si può saltare questa lezione ad una prima lettura, tornando su
+piuttosto ridotto. Trattandosi di problematiche abbastanza complesse, che
+spesso presuppongono la conoscenza di altri argomenti trattati nel seguito
+della guida, si può saltare questa sezione in una prima lettura, tornando su
 di essa in un secondo tempo.
 
 \subsection{La system call \func{clone}}
 \label{sec:process_clone}
 
-Da fare
+La funzione tradizionale con cui creare un nuovo processo in un sistema
+Unix-like, come illustrato in sez.~\ref{sec:proc_fork}, è \func{fork}, ma con
+l'introduzione del supporto del kernel per i \textit{thread} (vedi
+cap.~\ref{cha:threads}), si è avuta la necessità di una interfaccia che
+consentisse un maggiore controllo sulla modalità con cui vengono creati nuovi
+processi, che poi è stata utilizzata anche per fornire supporto per le
+tecnologie di virtualizzazione dei processi (i cosiddetti \textit{container}).
+
+Per questo l'interfaccia per la creazione di un nuovo processo è stata
+delegata ad una nuova \textit{system call}, \func{sys\_clone}, che consente di
+reimplementare anche la tradizionale \func{fork}. In realtà in questo caso più
+che di nuovi processi si può parlare della creazioni di nuovi
+``\textit{task}'' del kernel che possono assumere la veste sia di un processo
+classico come quelli trattati finora, che di un \textit{thread}, come quelli
+che vedremo in sez.~\ref{sec:linux_thread}, in cui la memoria viene condivisa
+fra il processo chiamante ed il nuovo processo creato. Per evitare confusione
+fra \textit{thread} e processi ordinari, abbiamo deciso di usare la
+nomenclatura \textit{task} per indicare la unità di esecuzione generica messa
+a disposizione del kernel che \texttt{sys\_clone} permette di creare.
+
+Oltre a questo la funzione consente, ad uso delle nuove funzionalità di
+virtualizzazione dei processi, di creare nuovi \textit{namespace} per una
+serie di proprietà generali dei processi (come l'elenco dei PID, l'albero dei
+file, dei \textit{mount point}, della rete, ecc.), che consentono di creare
+gruppi di processi che vivono in una sorta di spazio separato dagli altri, che
+costituisce poi quello che viene chiamato un \textit{container}.
+
+La \textit{system call} richiede soltanto due argomenti: il
+primo, \param{flags}, consente di controllare le modalità di creazione del
+nuovo \textit{task}, il secondo, \param{child\_stack}, imposta l'indirizzo
+dello \itindex{stack} \textit{stack} per il nuovo \textit{task}, e deve essere
+indicato quando si intende creare un \textit{thread}. L'esecuzione del
+programma creato da \func{sys\_clone} riprende, come per \func{fork}, da
+dopo l'esecuzione della stessa.
+
+La necessità di avere uno \itindex{stack} \textit{stack} alternativo c'è solo
+quando si intende creare un \textit{thread}, in tal caso infatti il nuovo
+\textit{task} vede esattamente la stessa memoria del \textit{task}
+``\textsl{padre}'',\footnote{in questo caso per padre si intende semplicemente
+  il \textit{task} che ha eseguito \func{sys\_clone} rispetto al \textit{task}
+  da essa creato, senza nessuna delle implicazioni che il concetto ha per i
+  processi.} e nella sua esecuzione alla prima chiamata di una funzione
+andrebbe a scrivere sullo \textit{stack} usato anche dal padre (si ricordi
+quanto visto in sez.~\ref{sec:proc_mem_layout} riguardo all'uso dello
+\textit{stack}).
+
+Per evitare di doversi garantire contro la evidente possibilità di
+\itindex{race~condition} \textit{race condition} che questa situazione
+comporta (vedi sez.~\ref{sec:proc_race_cond} per una spiegazione della
+problematica) è necessario che il chiamante allochi preventivamente un'area di
+memoria.  In genere lo si fa con una \func{malloc} che allochi un buffer che
+la funzione imposterà come \textit{stack} del nuovo processo, avendo
+ovviamente cura di non utilizzarlo direttamente nel processo chiamante. In
+questo modo i due \textit{task} avranno degli \textit{stack} indipendenti e
+non si dovranno affrontare problematiche di \itindex{race~condition}
+\textit{race condition}.  Si tenga presente inoltre che in molte architetture
+di processore lo \textit{stack} cresce verso il basso, pertanto in tal caso
+non si dovrà specificare per \param{child\_stack} il puntatore restituito da
+\func{malloc}, ma un puntatore alla fine del buffer da essa allocato.
+
+Dato che tutto ciò è necessario solo per i \textit{thread} che condividono la
+memoria, la \textit{system call}, a differenza della funzione di libreria che
+vedremo a breve, consente anche di passare per \param{child\_stack} il valore
+\val{NULL}, che non imposta un nuovo \textit{stack}. Se infatti si crea un
+processo, questo ottiene un suo nuovo spazio degli indirizzi,\footnote{è
+  sottinteso cioè che non si stia usando il flag \const{CLONE\_VM}.} ed in
+questo caso si applica la semantica del \itindex{copy-on-write} \textit{copy
+  on write} illustrata in sez.~\ref{sec:proc_fork}, per cui le pagine dello
+\textit{stack} verranno automaticamente copiate come le altre e il nuovo
+processo avrà un suo \textit{stack} totalmente indipendente da quello del
+padre.
+
+Dato che l'uso principale della nuova \textit{system call} è quello relativo
+alla creazione dei \textit{thread}, le \acr{glibc} definiscono una funzione di
+libreria con una sintassi diversa, orientata a questo scopo, e la
+\textit{system call} resta accessibile solo se invocata esplicitamente come
+visto in sez.~\ref{sec:proc_syscall}.\footnote{ed inoltre per questa
+  \textit{system call} non è disponibile la chiamata veloce con
+  \texttt{vsyscall}.} La funzione di libreria si chiama semplicemente
+\funcd{clone} ed il suo prototipo è:
+\begin{functions}
+  \headdecl{sys/sched.h}
+
+  \funcdecl{int clone(int (*fn)(void *), void *child\_stack, int
+    flags, void *arg, ...  \\
+    /* pid\_t *ptid, struct user\_desc *tls, pid\_t *ctid */)}
+  
+  Crea un nuovo processo o \textit{thread} eseguendo la funzione \param{fn}.
+  
+  \bodydesc{La funzione ritorna al chiamante il \textit{Thread ID} assegnato
+    al nuovo processo in caso di successo e $-1$ in caso di errore, nel qual
+    caso  \var{errno} può assumere i valori:
+    \begin{errlist}
+    \item[\errcode{EAGAIN}] sono già in esecuzione troppi processi.
+    \item[\errcode{EINVAL}] si è usata una combinazione non valida di flag o
+      un valore nullo per \param{child\_stack}.
+    \item[\errcode{ENOMEM}] non c'è memoria sufficiente per creare una nuova
+      \struct{task\_struct} o per copiare le parti del contesto del chiamante
+      necessarie al nuovo \textit{task}.
+    \item[\errcode{EPERM}] non si hanno i privilegi di amministratore
+      richiesti dai flag indicati.
+  \end{errlist} 
+ }
+\end{functions}
+
+La funzione prende come primo argomento il puntatore alla funzione che verrà
+messa in esecuzione nel nuovo processo, che può avere un unico argomento di
+tipo puntatore a \ctyp{void}, il cui valore viene passato dal terzo
+argomento \param{arg}; per quanto il precedente prototipo possa intimidire
+nella sua espressione, in realtà l'uso è molto semplice basterà definire una
+qualunque funzione \param{fn} del tipo indicato, e \code{fn(arg)} sarà
+eseguita in un nuovo processo.
+
+Il nuovo processo resterà in esecuzione fintanto che la funzione \param{fn}
+non ritorna, o esegue \func{exit} o viene terminata da un segnale. Il valore
+di ritorno della funzione (o quello specificato con \func{exit}) verrà
+utilizzato come stato di uscita della funzione.
+
+I tre argomenti \param{ptid}, \param{tls} e \param{ctid} sono opzionali e sono
+presenti solo a partire dal kernel 2.6.
+
+Il comportamento di \func{clone}, che si riflette sulle caratteristiche del
+nuovo processo da essa creato, è controllato dall'argomento \param{flags},
+
+\begin{basedescript}{\desclabelstyle{\pushlabel}}
+
+\item[\const{CLONE\_CHILD\_CLEARTID}]
+\item[\const{CLONE\_CHILD\_SETTID}]
+\item[\const{CLONE\_FILES}]
+\item[\const{CLONE\_FS}]
+\item[\const{CLONE\_IO}]
+\item[\const{CLONE\_NEWIPC}]
+\item[\const{CLONE\_NEWNET}]
+\item[\const{CLONE\_NEWNS}]
+\item[\const{CLONE\_NEWPID}]
+\item[\const{CLONE\_NEWUTS}]
+\item[\const{CLONE\_PARENT}]
+\item[\const{CLONE\_PARENT\_SETTID}]
+\item[\const{CLONE\_PID}]
+\item[\const{CLONE\_PTRACE}]
+\item[\const{CLONE\_SETTLS}]
+\item[\const{CLONE\_SIGHAND}]
+\item[\const{CLONE\_STOPPED}]
+\item[\const{CLONE\_SYSVSEM}]
+\item[\const{CLONE\_THREAD}]
+\item[\const{CLONE\_UNTRACED}]
+\item[\const{CLONE\_VFORK}]
+\item[\const{CLONE\_VM}]
+\end{basedescript}
+
 
 \subsection{La funzione \func{prctl}}
 \label{sec:process_prctl}
@@ -3307,8 +3455,8 @@ proprietà e caratteristiche particolari dei processi non coperte da esse, per
 la cui gestione è stata predisposta una apposita \textit{system call} che
 fornisce una interfaccia generica per tutte le operazioni specialistiche. La
 funzione è \funcd{prctl} ed il suo prototipo è:\footnote{la funzione non è
-  standardizzata ed è specifica di Linux, anche se ne esiete una analoga in
-  IRIX, è stata introdotta con il kernel 2.1.57.}
+  standardizzata ed è specifica di Linux, anche se ne esiste una analoga in
+  IRIX; è stata introdotta con il kernel 2.1.57.}
 \begin{functions}
   \headdecl{sys/prctl.h}
 
@@ -3345,10 +3493,11 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento:
   nell'argomento \param{arg2} con una delle costanti di
   tab.~\ref{tab:proc_capabilities} dal \textit{capabilities bounding set} del
   processo. L'operazione richiede i privilegi di amministratore (la capacità
-  \const{CAP\_SETPCAP}), altrimenti fallisce con un errore di \errval{EPERM};
-  se il valore di \param{arg2} non è valido o se il supporto per le
-  \textit{file capabilities} non è stato compilato nel kernel fallisce con un
-  errore di \errval{EINVAL}. Introdotta a partire dal kernel 2.6.25.
+  \const{CAP\_SETPCAP}), altrimenti la chiamata fallirà con un errore di
+  \errval{EPERM}; se il valore di \param{arg2} non è valido o se il supporto
+  per le \textit{file capabilities} non è stato compilato nel kernel la
+  chiamata fallirà con un errore di \errval{EINVAL}. Introdotta a partire dal
+  kernel 2.6.25.
 \item[\const{PR\_SET\_DUMPABLE}] Imposta il flag che determina se la
   terminazione di un processo a causa di un segnale per il quale è prevista la
   generazione di un file di \itindex{core~dump} \textit{core dump} (vedi
@@ -3389,7 +3538,8 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento:
   di \param{arg2}, si deve passare \const{PR\_FPEMU\_NOPRINT} per emulare in
   maniera trasparente l'accesso alle operazioni in virgola mobile, o
   \const{PR\_FPEMU\_SIGFPE} per non emularle ed inviare il segnale
-  \const{SIGFPE}. Introdotta a partire dal kernel 2.4.18, solo su ia64.
+  \const{SIGFPE} (vedi sez.~\ref{sec:sig_prog_error}). Introdotta a partire
+  dal kernel 2.4.18, solo su ia64.
 \item[\const{PR\_GET\_FPEMU}] Ottiene il valore dei flag di controllo
   dell'emulazione della virgola mobile, salvato all'indirizzo puntato
   da \param{arg2}, che deve essere di tipo \code{(int *)}. Introdotta a
@@ -3402,10 +3552,10 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento:
   per gli underflow, \const{PR\_FP\_EXC\_RES} per risultati non esatti,
   \const{PR\_FP\_EXC\_INV} per operazioni invalide,
   \const{PR\_FP\_EXC\_DISABLED} per disabilitare le eccezioni,
-  \const{PR\_FP\_EXC\_NONRECOV} per utilizzare la modalità di eccesione
+  \const{PR\_FP\_EXC\_NONRECOV} per utilizzare la modalità di eccezione
   asincrona non recuperabile, \const{PR\_FP\_EXC\_ASYNC} per utilizzare la
-  modalità di eccesione asincrona recuperabile, \const{PR\_FP\_EXC\_PRECISE}
-  per la modalita precisa di eccezione.\footnote{trattasi di gestione
+  modalità di eccezione asincrona recuperabile, \const{PR\_FP\_EXC\_PRECISE}
+  per la modalità precisa di eccezione.\footnote{trattasi di gestione
     specialistica della gestione delle eccezioni dei calcoli in virgola mobile
     che, i cui dettagli al momento vanno al di là dello scopo di questo
     testo.} Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
@@ -3419,10 +3569,10 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento:
   sez.~\ref{sec:proc_capabilities}, in particolare quanto illustrato a
   pag.~\pageref{sec:capability-uid-transition}). Un valore nullo (il default)
   per \param{arg2} comporta che vengano cancellate, il valore 1 che vengano
-  manenute, questo valore viene sempre cancellato attraverso una
-  \func{exec}. L'uso di questo flag è stato sostituito, a partire dal kernel
-  2.6.26, dal flag \const{SECURE\_KEEP\_CAPS} dei \itindex{securebits}
-  \textit{securebits} (vedi \const{PR\_SET\_SECUREBITS}). Introdotta a partire
+  mantenute, questo valore viene sempre cancellato attraverso una \func{exec}.
+  L'uso di questo flag è stato sostituito, a partire dal kernel 2.6.26, dal
+  flag \const{SECURE\_KEEP\_CAPS} dei \itindex{securebits} \textit{securebits}
+  (vedi l'uso di \const{PR\_SET\_SECUREBITS} più avanti). Introdotta a partire
   dal kernel 2.2.18.
 \item[\const{PR\_GET\_KEEPCAPS}] Ottiene come valore di ritorno della funzione
   il valore del flag di controllo impostato con
@@ -3437,11 +3587,11 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento:
   se più corto. Introdotta a partire dal kernel 2.6.9.
 \item[\const{PR\_SET\_PDEATHSIG}] Consente di richiedere l'emissione di un
   segnale, che sarà ricevuto dal processo chiamante, in occorrenza della
-  terminazione del proprio processo padre.\footnote{in sostanza consente di
-    invertire il ruolo di \const{SIGCHLD}.} Il valore di \param{arg2} deve
-  indicare il numero del segnale, o 0 per disabilitare l'emissione. Il valore
-  viene automaticamente cancellato per un processo figlio creato con
-  \func{fork}.  Introdotta a partire dal kernel 2.1.57.
+  terminazione del proprio processo padre; in sostanza consente di invertire
+  il ruolo di \const{SIGCHLD}. Il valore di \param{arg2} deve indicare il
+  numero del segnale, o 0 per disabilitare l'emissione. Il valore viene
+  automaticamente cancellato per un processo figlio creato con \func{fork}.
+  Introdotta a partire dal kernel 2.1.57.
 \item[\const{PR\_GET\_PDEATHSIG}] Ottiene il valore dell'eventuale segnale
   emesso alla terminazione del padre, salvato all'indirizzo
   puntato \param{arg2}, che deve essere di tipo \code{(int *)}. Introdotta a
@@ -3453,15 +3603,16 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento:
   processo potrà utilizzare soltanto un insieme estremamente limitato di
   \textit{system call}: \func{read}, \func{write}, \func{\_exit} e
   \func{sigreturn}, ogni altra \textit{system call} porterà all'emissione di
-  un \func{SIGKILL}.  Il \textit{secure computing mode} è stato ideato per
-  fornire un supporto per l'esecuzione di codice esterno non fidato e non
-  verificabile a scopo di calcolo;\footnote{lo scopo è quello di poter vendere
-    la capacità di calcolo della proprio macchina ad un qualche servizio di
-    calcolo distribuito senza comprometterne la sicurezza eseguendo codice non
-    sotto il proprio controllo.} in genere i dati vengono letti o scritti
-  grazie ad un socket o una pipe, e per evitare problemi di sicurezza non sono
-  possibili altre operazioni se non quelle citate.  Introdotta a partire dal
-  kernel 2.6.23, disponibile solo se si è abilitato il supporto nel kernel con
+  un \func{SIGKILL} (vedi sez.~\ref{sec:sig_termination}).  Il \textit{secure
+    computing mode} è stato ideato per fornire un supporto per l'esecuzione di
+  codice esterno non fidato e non verificabile a scopo di calcolo;\footnote{lo
+    scopo è quello di poter vendere la capacità di calcolo della proprio
+    macchina ad un qualche servizio di calcolo distribuito senza
+    comprometterne la sicurezza eseguendo codice non sotto il proprio
+    controllo.} in genere i dati vengono letti o scritti grazie ad un socket o
+  una pipe, e per evitare problemi di sicurezza non sono possibili altre
+  operazioni se non quelle citate.  Introdotta a partire dal kernel 2.6.23,
+  disponibile solo se si è abilitato il supporto nel kernel con
   \texttt{CONFIG\_SECCOMP}.
 \item[\const{PR\_GET\_SECCOMP}] Ottiene come valore di ritorno della funzione
   lo stato corrente del \textit{secure computing mode}, al momento attuale la
@@ -3470,10 +3621,13 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento:
   comporterebbe l'emissione di \texttt{SIGKILL}, è stata comunque definita per
   eventuali estensioni future.  Introdotta a partire dal kernel 2.6.23.
 \item[\const{PR\_SET\_SECUREBITS}] Imposta i \itindex{securebits}
-  \textit{securebits} per il processo corrente al valore indicato
-  da \param{arg2}; per i dettagli si veda sez.~\ref{sec:proc_capabilities}, ed
-  in particolare i valori di tab.~\ref{tab:securebits_values} e la relativa
-  trattazione. Introdotta a partire dal kernel 2.6.26.
+  \textit{securebits} per il processo chiamante al valore indicato
+  da \param{arg2}; per i dettagli sul significato dei \textit{securebits} si
+  veda sez.~\ref{sec:proc_capabilities}, ed in particolare i valori di
+  tab.~\ref{tab:securebits_values} e la relativa trattazione. L'operazione
+  richiede i privilegi di amministratore (la capacità \const{CAP\_SETPCAP}),
+  altrimenti la chiamata fallirà con un errore di \errval{EPERM}. Introdotta a
+  partire dal kernel 2.6.26.
 \item[\const{PR\_GET\_SECUREBITS}] Ottiene come valore di ritorno della
   funzione l'impostazione corrente per i \itindex{securebits}
   \textit{securebits}. Introdotta a partire dal kernel 2.6.26.
@@ -3487,16 +3641,17 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento:
 \item[\const{PR\_GET\_TIMING}] Ottiene come valore di ritorno della funzione
   il metodo di temporizzazione del processo attualmente in uso. Introdotta a
   partire dal kernel 2.6.0-test4.
-\item[\const{PR\_SET\_TSC}] Imposta il flag che indica se il processo può
-  leggere il registro di processore contenente il contatore dei
+\item[\const{PR\_SET\_TSC}] Imposta il flag che indica se il processo
+  chiamante può leggere il registro di processore contenente il contatore dei
   \textit{timestamp} (TSC, o \textit{Time Stamp Counter}) da indicare con il
   valore di \param{arg2}. Si deve specificare \const{PR\_TSC\_ENABLE} per
   abilitare la lettura o \const{PR\_TSC\_SIGSEGV} per disabilitarla con la
-  generazione di un segnale di \const{SIGSEGV}. La lettura viene
-  automaticamente disabilitata se si attiva il \textit{secure computing mode}.
-  Introdotta a partire dal kernel 2.6.26, solo su x86.
+  generazione di un segnale di \const{SIGSEGV} (vedi
+  sez.~\ref{sec:sig_prog_error}). La lettura viene automaticamente
+  disabilitata se si attiva il \textit{secure computing mode}.  Introdotta a
+  partire dal kernel 2.6.26, solo su x86.
 \item[\const{PR\_GET\_TSC}] Ottiene il valore del flag che controlla la
-  lettura del contatatore dei \textit{timestamp}, salvato all'indirizzo
+  lettura del contattore dei \textit{timestamp}, salvato all'indirizzo
   puntato \param{arg2}, che deve essere di tipo \code{(int *)}. Introdotta a
   partire dal kernel 2.6.26, solo su x86.
 % articoli sul TSC e relativi problemi: http://lwn.net/Articles/209101/,
@@ -3504,17 +3659,64 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento:
 % http://en.wikipedia.org/wiki/Time_Stamp_Counter 
 \item[\const{PR\_SET\_UNALIGN}] Imposta la modalità di controllo per l'accesso
   a indirizzi di memoria non allineati, che in varie architetture risultano
-  illegali, da indicare con il valore di \param{arg2}. Si deve specificare
-  \const{PR\_UNALIGN\_NOPRINT} per ignorare gli accessi non allineati, e
-  \const{PR\_UNALIGN\_SIGBUS} per generare un segnale di \const{SIGBUS} in
-  caso di accesso non allineato.  Introdotta con diverse versioni su diverse
-  architetture.
+  illegali, da indicare con il valore di \param{arg2}. Si deve specificare il
+  valore \const{PR\_UNALIGN\_NOPRINT} per ignorare gli accessi non allineati,
+  ed il valore \const{PR\_UNALIGN\_SIGBUS} per generare un segnale di
+  \const{SIGBUS} (vedi sez.~\ref{sec:sig_prog_error}) in caso di accesso non
+  allineato.  Introdotta con diverse versioni su diverse architetture.
 \item[\const{PR\_GET\_UNALIGN}] Ottiene il valore della modalità di controllo
   per l'accesso a indirizzi di memoria non allineati, salvato all'indirizzo
   puntato \param{arg2}, che deve essere di tipo \code{(int *)}. Introdotta con
   diverse versioni su diverse architetture.
-\item[\const{PR\_MCE\_KILL}] Introdotta a partire dal kernel 2.6.32.
-\item[\const{PR\_MCE\_KILL\_GET}] Introdotta a partire dal kernel 2.6.32.
+\item[\const{PR\_MCE\_KILL}] Imposta la politica di gestione degli errori
+  dovuti a corruzione della memoria per problemi hardware. Questo tipo di
+  errori vengono riportati dall'hardware di controllo della RAM e vengono
+  gestiti dal kernel,\footnote{la funzionalità è disponibile solo sulle
+    piattaforme più avanzate che hanno il supporto hardware per questo tipo di
+    controlli.} ma devono essere opportunamente riportati ai processi che
+  usano quella parte di RAM che presenta errori; nel caso specifico questo
+  avviene attraverso l'emissione di un segnale di \const{SIGBUS} (vedi
+  sez.~\ref{sec:sig_prog_error}).\footnote{in particolare viene anche
+    impostato il valore di \var{si\_code} in \struct{siginfo\_t} a
+    \const{BUS\_MCEERR\_AO}; per il significato di tutto questo si faccia
+    riferimento alla trattazione di sez.~\ref{sec:sig_sigaction}.}
+
+  Il comportamento di default prevede che per tutti i processi si applichi la
+  politica generale di sistema definita nel file
+  \procfile{/proc/sys/vm/memory\_failure\_early\_kill}, ma specificando
+  per \param{arg2} il valore \const{PR\_MCE\_KILL\_SET} è possibile impostare
+  con il contenuto di \param{arg3} una politica specifica del processo
+  chiamante. Si può tornare alla politica di default del sistema utilizzando
+  invece per \param{arg2} il valore \const{PR\_MCE\_KILL\_CLEAR}. In tutti i
+  casi, per compatibilità con eventuali estensioni future, tutti i valori
+  degli argomenti non utilizzati devono essere esplicitamente posti a zero,
+  pena il fallimento della chiamata con un errore di \errval{EINVAL}.
+  
+  In caso di impostazione di una politica specifica del processo con
+  \const{PR\_MCE\_KILL\_SET} i valori di \param{arg3} possono essere soltanto
+  due, che corrispondono anche al valore che si trova nell'impostazione
+  generale di sistema di \texttt{memory\_failure\_early\_kill}, con
+  \const{PR\_MCE\_KILL\_EARLY} si richiede l'emissione immediata di
+  \const{SIGBUS} non appena viene rilevato un errore, mentre con
+  \const{PR\_MCE\_KILL\_LATE} il segnale verrà inviato solo quando il processo
+  tenterà un accesso alla memoria corrotta. Questi due valori corrispondono
+  rispettivamente ai valori 1 e 0 di
+  \texttt{memory\_failure\_early\_kill}.\footnote{in sostanza nel primo caso
+    viene immediatamente inviato il segnale a tutti i processi che hanno la
+    memoria corrotta mappata all'interno del loro spazio degli indirizzi, nel
+    secondo caso prima la pagina di memoria viene tolta dallo spazio degli
+    indirizzi di ciascun processo, mentre il segnale viene inviato solo quei
+    processi che tentano di accedervi.} Si può usare per \param{arg3} anche un
+  terzo valore, \const{PR\_MCE\_KILL\_DEFAULT}, che corrisponde a impostare
+  per il processo la politica di default.\footnote{si presume la politica di
+    default corrente, in modo da non essere influenzati da un eventuale
+    successivo cambiamento della stessa.} Introdotta a partire dal kernel
+  2.6.32.
+\item[\const{PR\_MCE\_KILL\_GET}] Ottiene come valore di ritorno della
+  funzione la politica di gestione degli errori dovuti a corruzione della
+  memoria. Tutti gli argomenti non utilizzati (al momento tutti) devono essere
+  nulli pena la ricezione di un errore di \errval{EINVAL}. Introdotta a
+  partire dal kernel 2.6.32.
 \label{sec:prctl_operation}
 \end{basedescript}
 
@@ -3526,6 +3728,9 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento:
 
 Da fare
 
+% TODO: trattare PTRACE_SEIZE, aggiunta con il kernel 3.1
+
+
 \subsection{L'accesso alle porte di I/O}
 \label{sec:process_io_port}
 
@@ -3747,10 +3952,15 @@ varie funzioni di libreria, che sono identificate aggiungendo il suffisso
 % LocalWords:  CONTINUED sources forking Spawned successfully executing exiting
 % LocalWords:  next cat for COMMAND pts bash defunct TRAPPED DUMPED Killable PR
 % LocalWords:  SIGKILL static RLIMIT preemption PREEMPT VOLUNTARY IDLE RTPRIO
-% LocalWords:  Completely Fair compat Uniform CFQ Queuing elevator dev cfq RT
-% LocalWords:  Documentation block syscall ioprio IPRIO CLASS class best effort
-% LocalWords:  refresh semop dnotify MADV DONTFORK prctl WCLONE SIGCHL WALL
-% LocalWords:  WNOTHREAD DUMPABLE KEEPCAPS
+% LocalWords:  completely fair compat uniform CFQ queuing elevator dev cfq RT
+% LocalWords:  documentation block syscall ioprio IPRIO CLASS class best effort
+% LocalWords:  refresh semop dnotify MADV DONTFORK prctl WCLONE WALL big
+% LocalWords:  WNOTHREAD DUMPABLE KEEPCAPS IRIX CAPBSET endianess endian flags
+% LocalWords:  little PPC PowerPC FPEMU NOPRINT SIGFPE FPEXC point FP SW malloc
+% LocalWords:  exception EXC ENABLE OVF overflow UND underflow RES INV DISABLED
+% LocalWords:  NONRECOV ASYNC KEEP securebits NAME NUL PDEATHSIG SECCOMP VM
+% LocalWords:  secure computing sigreturn TIMING STATISTICAL TSC MCE conditions
+% LocalWords:  timestamp Stamp SIGSEGV UNALIGN SIGBUS MCEERR AO failure early
  
 %%% Local Variables: 
 %%% mode: latex