Nuovo capitolo sulla gestione avanzata dei processi, in cui si è
[gapil.git] / procadv.tex
1 \chapter{La gestione avanzata dei processi}
2 \label{cha:proc_advanced}
3
4 In questo capitolo affronteremo le tematiche relative alla gestione avanzata
5 dei processi, trattando le \textit{system call} dedicate alle funzionalità più
6 specifiche ed avanzate, il cui uso è in genere piuttosto ridotto.  Inizieremo
7 con le funzioni che attengono agli aspetti di controllo, passando alle
8 gestione delle modalità di creazione ed alle funzionalità attinenti i
9 \textit{namespace} e le funzionalità avanzate relative alla gestione della
10 sicurezza. Infine affronteremo le funzioni di gestione per una serie di
11 funzionalità specialistiche come la gestione della virgola mobile, le porte di
12 I/O ecc.
13
14 \section{Funzioni di gestione e controllo}
15 \label{sec:proc_manage_control}
16
17 In questa sezione prenderemo in esame alcune specifice \textit{system call}
18 dedicate al controllo processi sia per quanto riguarda l'impostazione di
19 caratteristiche specialistiche, che per quanto riguarda l'analisi ed il
20 controllo della loro esecuzione.
21
22 \subsection{La funzione \func{prctl}}
23 \label{sec:process_prctl}
24
25 Benché la gestione ordinaria dei processi possa essere effettuata attraverso
26 le funzioni che abbiamo già esaminato nei capitoli \ref{cha:process_interface}
27 e \ref{cha:process_handling}, esistono una serie di proprietà e
28 caratteristiche specifiche dei proecessi per la cui gestione è stata
29 predisposta una apposita \textit{system call} che fornisce una interfaccia
30 generica per tutte le operazioni specialistiche. La funzione di sistema è
31 \funcd{prctl} ed il suo prototipo è:\footnote{la funzione non è standardizzata
32   ed è specifica di Linux, anche se ne esiste una analoga in IRIX; è stata
33   introdotta con il kernel 2.1.57.}
34
35 \begin{funcproto}{ 
36 \fhead{sys/prctl.h}
37 \fdecl{int prctl(int option, unsigned long arg2, unsigned long arg3, unsigned
38   long arg4, \\
39 \phantom{int prctl(}unsigned long arg5)}
40 \fdesc{Esegue una operazione speciale sul processo corrente.} 
41 }
42
43 {La funzione ritorna $0$ o un valore positivo dipendente dall'operazione in
44   caso di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà
45   valori diversi a seconda del tipo di operazione richiesta, sono possibili:
46   \errval{EACCESS}, \errval{EBADF}, \errval{EBUSY}, \errval{EFAULT},
47   \errval{EINVAL}, \errval{ENXIO}, \errval{EOPNOTSUPP} o \errval{EPERM}.}
48 \end{funcproto}
49
50 La funzione ritorna in caso di successo un valore nullo o positivo, e $-1$ in
51 caso di errore. Il significato degli argomenti della funzione successivi al
52 primo, il valore di ritorno in caso di successo, il tipo di errore restituito
53 in \var{errno} dipendono dall'operazione eseguita, indicata tramite il primo
54 argomento, \param{option}. Questo è un valore intero che identifica
55 l'operazione, e deve essere specificato con l'uso di una delle costanti
56 predefinite del seguente elenco.\footnote{l'elenco potrebbe non risultare
57   aggiornato, in quanto nuove operazioni vengono aggiunte nello sviluppo del
58   kernel.} Tratteremo esplicitamente per ciascuna di esse il significato del
59 il valore di ritorno in caso di successo, ma solo quando non corrisponde
60 all'ordinario valore nullo (dato per implicito).
61
62 %TODO: trattare PR_CAP_AMBIENT, dal 4.3
63 %TODO: trattare PR_CAP_FP_*, dal 4.0, solo per MIPS
64 %TODO: trattare PR_MPX_*_MANAGEMENT, dal 3.19
65 %TODO: trattare PR_*NO_NEW_PRIVS, dal 3.5
66
67 \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
68 \item[\constd{PR\_CAPBSET\_READ}] Controlla la disponibilità di una delle
69   \textit{capability} (vedi sez.~\ref{sec:proc_capabilities}). La funzione
70   ritorna 1 se la capacità specificata nell'argomento \param{arg2} (con una
71   delle costanti di tab.~\ref{tab:proc_capabilities}) è presente nel
72   \textit{capabilities bounding set} del processo e zero altrimenti,
73   se \param{arg2} non è un valore valido si avrà un errore di \errval{EINVAL}.
74   Introdotta a partire dal kernel 2.6.25.
75
76 \item[\constd{PR\_CAPBSET\_DROP}] Rimuove permanentemente una delle
77   \textit{capabilities} (vedi sez.~\ref{sec:proc_capabilities}) dal processo e
78   da tutti i suoi discendenti. La funzione cancella la capacità specificata
79   nell'argomento \param{arg2} con una delle costanti di
80   tab.~\ref{tab:proc_capabilities} dal \textit{capabilities bounding set} del
81   processo. L'operazione richiede i privilegi di amministratore (la capacità
82   \const{CAP\_SETPCAP}), altrimenti la chiamata fallirà con un errore di
83   \errcode{EPERM}; se il valore di \param{arg2} non è valido o se il supporto
84   per le \textit{file capabilities} non è stato compilato nel kernel la
85   chiamata fallirà con un errore di \errval{EINVAL}. Introdotta a partire dal
86   kernel 2.6.25.
87
88 \item[\constd{PR\_SET\_DUMPABLE}] Imposta il flag che determina se la
89   terminazione di un processo a causa di un segnale per il quale è prevista la
90   generazione di un file di \textit{core dump} (vedi
91   sez.~\ref{sec:sig_standard}) lo genera effettivamente. In genere questo flag
92   viene attivato automaticamente, ma per evitare problemi di sicurezza (la
93   generazione di un file da parte di processi privilegiati può essere usata
94   per sovrascriverne altri) viene cancellato quando si mette in esecuzione un
95   programma con i bit \acr{suid} e \acr{sgid} attivi (vedi
96   sez.~\ref{sec:file_special_perm}) o con l'uso delle funzioni per la modifica
97   degli \ids{UID} dei processi (vedi sez.~\ref{sec:proc_setuid}).
98
99   L'operazione è stata introdotta a partire dal kernel 2.3.20, fino al kernel
100   2.6.12 e per i kernel successivi al 2.6.17 era possibile usare solo un
101   valore 0 (espresso anche come \constd{SUID\_DUMP\_DISABLE}) di \param{arg2}
102   per disattivare il flag ed un valore 1 (espresso anche come
103   \constd{SUID\_DUMP\_USER}) per attivarlo. Nei kernel dal 2.6.13 al 2.6.17 è
104   stato supportato anche il valore 2, che causava la generazione di un
105   \textit{core dump} leggibile solo dall'amministratore, ma questa
106   funzionalità è stata rimossa per motivi di sicurezza, in quanto consentiva
107   ad un utente normale di creare un file di \textit{core dump} appartenente
108   all'amministratore in directory dove l'utente avrebbe avuto permessi di
109   accesso. Specificando un valore diverso da 0 o 1 si ottiene un errore di
110   \errval{EINVAL}.
111
112 \item[\constd{PR\_GET\_DUMPABLE}] Ottiene come valore di ritorno della funzione
113   lo stato corrente del flag che controlla la effettiva generazione dei
114   \textit{core dump}. Introdotta a partire dal kernel 2.3.20.
115
116 \item[\constd{PR\_SET\_ENDIAN}] Imposta la \textit{endianness} del processo
117   chiamante secondo il valore fornito in \param{arg2}. I valori possibili sono
118   sono: \constd{PR\_ENDIAN\_BIG} (\textit{big endian}),
119   \constd{PR\_ENDIAN\_LITTLE} (\textit{little endian}), e
120   \constd{PR\_ENDIAN\_PPC\_LITTLE} (lo pseudo \textit{little endian} del
121   PowerPC). Introdotta a partire dal kernel 2.6.18, solo per architettura
122   PowerPC.
123
124 \item[\constd{PR\_GET\_ENDIAN}] Ottiene il valore della \textit{endianness} del
125   processo chiamante, salvato sulla variabile puntata da \param{arg2} che deve
126   essere passata come di tipo ``\ctyp{int *}''. Introdotta a partire dal
127   kernel 2.6.18, solo su PowerPC.
128
129 \item[\constd{PR\_SET\_FPEMU}] Imposta i bit di controllo per l'emulazione
130   della virgola mobile su architettura ia64, secondo il valore
131   di \param{arg2}, si deve passare \constd{PR\_FPEMU\_NOPRINT} per emulare in
132   maniera trasparente l'accesso alle operazioni in virgola mobile, o
133   \constd{PR\_FPEMU\_SIGFPE} per non emularle ed inviare il segnale
134   \signal{SIGFPE} (vedi sez.~\ref{sec:sig_prog_error}). Introdotta a partire
135   dal kernel 2.4.18, solo su architettura ia64.
136
137 \item[\constd{PR\_GET\_FPEMU}] Ottiene il valore dei flag di controllo
138   dell'emulazione della virgola mobile, salvato all'indirizzo puntato
139   da \param{arg2}, che deve essere di tipo ``\ctyp{int *}''. Introdotta a
140   partire dal kernel 2.4.18, solo su architettura ia64.
141
142 \item[\constd{PR\_SET\_FPEXC}] Imposta la modalità delle eccezioni in virgola
143   mobile (\textit{floating-point exception mode}) al valore di \param{arg2}.
144   I valori possibili sono: 
145   \begin{itemize*}
146   \item \constd{PR\_FP\_EXC\_SW\_ENABLE} per usare FPEXC per le eccezioni,
147   \item \constd{PR\_FP\_EXC\_DIV} per la divisione per zero in virgola mobile,
148   \item \constd{PR\_FP\_EXC\_OVF} per gli overflow,
149   \item \constd{PR\_FP\_EXC\_UND} per gli underflow,
150   \item \constd{PR\_FP\_EXC\_RES} per risultati non esatti,
151   \item \constd{PR\_FP\_EXC\_INV} per operazioni invalide,
152   \item \constd{PR\_FP\_EXC\_DISABLED} per disabilitare le eccezioni,
153   \item \constd{PR\_FP\_EXC\_NONRECOV} per usare la modalità di eccezione
154     asincrona non recuperabile,
155   \item \constd{PR\_FP\_EXC\_ASYNC} per usare la modalità di eccezione
156     asincrona recuperabile,
157   \item \constd{PR\_FP\_EXC\_PRECISE} per la modalità precisa di
158     eccezione.\footnote{trattasi di gestione specialistica della gestione
159       delle eccezioni dei calcoli in virgola mobile che, i cui dettagli al
160       momento vanno al di là dello scopo di questo testo.}
161   \end{itemize*}
162 Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
163
164 \item[\constd{PR\_GET\_FPEXC}] Ottiene il valore della modalità delle eccezioni
165   delle operazioni in virgola mobile, salvata all'indirizzo
166   puntato \param{arg2}, che deve essere di tipo ``\ctyp{int *}''.  Introdotta
167   a partire dal kernel 2.4.21, solo su PowerPC.
168
169 \item[\constd{PR\_SET\_KEEPCAPS}] Consente di controllare quali
170   \textit{capabilities} vengono cancellate quando si esegue un cambiamento di
171   \ids{UID} del processo (per i dettagli si veda
172   sez.~\ref{sec:proc_capabilities}, in particolare quanto illustrato a
173   pag.~\pageref{sec:capability-uid-transition}). Un valore nullo (il default)
174   per \param{arg2} comporta che vengano cancellate, il valore 1 che vengano
175   mantenute, questo valore viene sempre cancellato attraverso una \func{exec}.
176   L'uso di questo flag è stato sostituito, a partire dal kernel 2.6.26, dal
177   flag \const{SECURE\_KEEP\_CAPS} dei \textit{securebits} (vedi
178   sez.~\ref{sec:proc_capabilities} e l'uso di \const{PR\_SET\_SECUREBITS} più
179   avanti) e si è impostato con essi \const{SECURE\_KEEP\_CAPS\_LOCKED} si
180   otterrà un errore di \errval{EPERM}.  Introdotta a partire dal kernel
181   2.2.18.
182
183 \item[\constd{PR\_GET\_KEEPCAPS}] Ottiene come valore di ritorno della funzione
184   il valore del flag di controllo delle \textit{capabilities} impostato con
185   \const{PR\_SET\_KEEPCAPS}. Introdotta a partire dal kernel 2.2.18.
186
187 \item[\constd{PR\_SET\_NAME}] Imposta il nome del processo chiamante alla
188   stringa puntata da \param{arg2}, che deve essere di tipo ``\ctyp{char *}''. Il
189   nome può essere lungo al massimo 16 caratteri, e la stringa deve essere
190   terminata da NUL se più corta.  Introdotta a partire dal kernel 2.6.9.
191
192 \item[\constd{PR\_GET\_NAME}] Ottiene il nome del processo chiamante nella
193   stringa puntata da \param{arg2}, che deve essere di tipo ``\ctyp{char *}'';
194   si devono allocare per questo almeno 16 byte, e il nome sarà terminato da
195   NUL se più corto. Introdotta a partire dal kernel 2.6.9.
196
197 \item[\constd{PR\_SET\_PDEATHSIG}] Consente di richiedere l'emissione di un
198   segnale, che sarà ricevuto dal processo chiamante, in occorrenza della
199   terminazione del proprio processo padre; in sostanza consente di invertire
200   il ruolo di \signal{SIGCHLD}. Il valore di \param{arg2} deve indicare il
201   numero del segnale, o 0 per disabilitare l'emissione. Il valore viene
202   automaticamente cancellato per un processo figlio creato con \func{fork}.
203   Introdotta a partire dal kernel 2.1.57.
204
205 \item[\constd{PR\_GET\_PDEATHSIG}] Ottiene il valore dell'eventuale segnale
206   emesso alla terminazione del padre, salvato all'indirizzo
207   puntato \param{arg2}, che deve essere di tipo ``\ctyp{int *}''. Introdotta a
208   partire dal kernel 2.3.15.
209
210 \item[\constd{PR\_SET\_PTRACER}] Imposta un \ids{PID} per il ``\textit{tracer
211     process}'' usando \param{arg2}. Una impostazione successiva sovrascrive la
212   precedente, ed un valore nullo cancella la disponibilità di un
213   ``\textit{tracer process}''. Questa è una funzionalità fornita da
214   \textit{``Yama''}, uno specifico \textit{Linux Security Modules}, e serve a
215   consentire al processo indicato, quando le restrizioni introdotte da questo
216   modulo sono attive, di usare \func{ptrace}\unavref{ (vedi
217     sez.\ref{sec:process_ptrace})} sul processo chiamante, anche se quello
218   indicato non ne è un progenitore. Il valore \constd{PR\_SET\_PTRACER\_ANY}
219   consente a tutti i processi l'uso di \func{ptrace}. L'uso si \textit{Yama}
220   attiene alla gestione della sicurezza dei processi, e consente di introdurre
221   una restrizione all'uso di \func{ptrace}, che è spesso sorgente di
222   compromissioni. Si tratta di un uso specialistico che va al di là dello
223   scopo di queste dispense, per i dettagli si consulti la documentazione su
224   \textit{Yama} nei sorgenti del kernel. Introdotta a partire dal kernel 3.4.
225
226 \itindbeg{secure~computing~mode}
227 \item[\constd{PR\_SET\_SECCOMP}] Imposta il cosiddetto \textit{secure computing
228     mode} per il processo corrente. Prevede come unica possibilità
229   che \param{arg2} sia impostato ad 1. Una volta abilitato il \textit{secure
230     computing mode} il processo potrà utilizzare soltanto un insieme
231   estremamente limitato di \textit{system call}: \func{read}, \func{write},
232   \func{\_exit} e \funcm{sigreturn}. Ogni altra \textit{system call} porterà
233   all'emissione di un \signal{SIGKILL} (vedi sez.~\ref{sec:sig_termination}).
234   Il \textit{secure computing mode} è stato ideato per fornire un supporto per
235   l'esecuzione di codice esterno non fidato e non verificabile a scopo di
236   calcolo;\footnote{lo scopo è quello di poter vendere la capacità di calcolo
237     della proprio macchina ad un qualche servizio di calcolo distribuito senza
238     comprometterne la sicurezza eseguendo codice non sotto il proprio
239     controllo.} in genere i dati vengono letti o scritti grazie ad un socket o
240   una \textit{pipe}, e per evitare problemi di sicurezza non sono possibili
241   altre operazioni se non quelle citate.  Introdotta a partire dal kernel
242   2.6.23, disponibile solo se si è abilitato il supporto nel kernel con
243   \texttt{CONFIG\_SECCOMP}.
244
245 % TODO a partire dal kernel 3.5 è stato introdotto la possibilità di usare un
246 % terzo argomento se il secondo è SECCOMP_MODE_FILTER, vedi
247 % Documentation/prctl/seccomp_filter.txt 
248 % vedi anche http://lwn.net/Articles/600250/
249
250 % TODO documentare PR_SET_SECCOMP introdotto a partire dal kernel 3.5. Vedi:
251 % * Documentation/prctl/seccomp_filter.txt
252 % * http://lwn.net/Articles/475043/
253
254 % TODO a partire dal kernel 3.17 è stata introdotta la nuova syscall seccomp,
255 % vedi http://lwn.net/Articles/600250/ e http://lwn.net/Articles/603321/
256
257 \item[\constd{PR\_GET\_SECCOMP}] Ottiene come valore di ritorno della funzione
258   lo stato corrente del \textit{secure computing mode}, al momento attuale la
259   funzione è totalmente inutile in quanto l'unico valore ottenibile è 0, dato
260   che la chiamata di questa funzione in \textit{secure computing mode}
261   comporterebbe l'emissione di \signal{SIGKILL}, è stata comunque definita per
262   eventuali estensioni future. Introdotta a partire dal kernel 2.6.23.
263 \itindend{secure~computing~mode}
264
265 \item[\constd{PR\_SET\_SECUREBITS}] Imposta i \textit{securebits} per il
266   processo chiamante al valore indicato da \param{arg2}; per i dettagli sul
267   significato dei \textit{securebits} si veda
268   sez.~\ref{sec:proc_capabilities}, ed in particolare i valori di
269   tab.~\ref{tab:securebits_values} e la relativa trattazione. L'operazione
270   richiede i privilegi di amministratore (la capacità \const{CAP\_SETPCAP}),
271   altrimenti la chiamata fallirà con un errore di \errval{EPERM}. Introdotta a
272   partire dal kernel 2.6.26.
273
274 \item[\constd{PR\_GET\_SECUREBITS}] Ottiene come valore di ritorno della
275   funzione l'impostazione corrente per i \textit{securebits}. Introdotta a
276   partire dal kernel 2.6.26.
277
278 \item[\constd{PR\_SET\_TIMING}] Imposta il metodo di temporizzazione del
279   processo da indicare con il valore di \param{arg2}, attualmente i valori
280   possibili sono due, con \constd{PR\_TIMING\_STATISTICAL} si usa il metodo
281   statistico tradizionale, con \constd{PR\_TIMING\_TIMESTAMP} il più accurato
282   basato su dei \textit{timestamp}, quest'ultimo però non è ancora
283   implementato ed il suo uso comporta la restituzione di un errore di
284   \errval{EINVAL}. Introdotta a partire dal kernel 2.6.0-test4.
285
286 \item[\constd{PR\_GET\_TIMING}] Ottiene come valore di ritorno della funzione
287   il metodo di temporizzazione del processo attualmente in uso (uno dei due
288   valori citati per \const{PR\_SET\_TIMING}). Introdotta a partire dal kernel
289   2.6.0-test4.
290
291 \item[\constd{PR\_SET\_TSC}] Imposta il flag che indica se il processo
292   chiamante può leggere il registro di processore contenente il contatore dei
293   \textit{timestamp} (TSC, o \textit{Time Stamp Counter}) da indicare con il
294   valore di \param{arg2}. Si deve specificare \constd{PR\_TSC\_ENABLE} per
295   abilitare la lettura o \constd{PR\_TSC\_SIGSEGV} per disabilitarla con la
296   generazione di un segnale di \signal{SIGSEGV} (vedi
297   sez.~\ref{sec:sig_prog_error}). La lettura viene automaticamente
298   disabilitata se si attiva il \textit{secure computing mode} (vedi
299   \const{PR\_SET\_SECCOMP}).  Introdotta a partire dal kernel
300   2.6.26, solo su x86.
301
302 \item[\constd{PR\_GET\_TSC}] Ottiene il valore del flag che controlla la
303   lettura del contattore dei \textit{timestamp}, salvato all'indirizzo
304   puntato \param{arg2}, che deve essere di tipo ``\ctyp{int *}''. Introdotta a
305   partire dal kernel 2.6.26, solo su x86.
306 % articoli sul TSC e relativi problemi: http://lwn.net/Articles/209101/,
307 % http://blog.cr0.org/2009/05/time-stamp-counter-disabling-oddities.html,
308 % http://en.wikipedia.org/wiki/Time_Stamp_Counter 
309
310 \item[\constd{PR\_SET\_UNALIGN}] Imposta la modalità di controllo per l'accesso
311   a indirizzi di memoria non allineati, che in varie architetture risultano
312   illegali, da indicare con il valore di \param{arg2}. Si deve specificare il
313   valore \constd{PR\_UNALIGN\_NOPRINT} per ignorare gli accessi non allineati,
314   ed il valore \constd{PR\_UNALIGN\_SIGBUS} per generare un segnale di
315   \signal{SIGBUS} (vedi sez.~\ref{sec:sig_prog_error}) in caso di accesso non
316   allineato.  Introdotta con diverse versioni su diverse architetture.
317
318 \item[\const{PR\_GET\_UNALIGN}] Ottiene il valore della modalità di controllo
319   per l'accesso a indirizzi di memoria non allineati, salvato all'indirizzo
320   puntato \param{arg2}, che deve essere di tipo \code{(int *)}. Introdotta con
321   diverse versioni su diverse architetture.
322 \item[\const{PR\_MCE\_KILL}] Imposta la politica di gestione degli errori
323   dovuti a corruzione della memoria per problemi hardware. Questo tipo di
324   errori vengono riportati dall'hardware di controllo della RAM e vengono
325   gestiti dal kernel,\footnote{la funzionalità è disponibile solo sulle
326     piattaforme più avanzate che hanno il supporto hardware per questo tipo di
327     controlli.} ma devono essere opportunamente riportati ai processi che
328   usano quella parte di RAM che presenta errori; nel caso specifico questo
329   avviene attraverso l'emissione di un segnale di \signal{SIGBUS} (vedi
330   sez.~\ref{sec:sig_prog_error}).\footnote{in particolare viene anche
331     impostato il valore di \var{si\_code} in \struct{siginfo\_t} a
332     \const{BUS\_MCEERR\_AO}; per il significato di tutto questo si faccia
333     riferimento alla trattazione di sez.~\ref{sec:sig_sigaction}.}
334
335   Il comportamento di default prevede che per tutti i processi si applichi la
336   politica generale di sistema definita nel file
337   \sysctlfiled{vm/memory\_failure\_early\_kill}, ma specificando
338   per \param{arg2} il valore \constd{PR\_MCE\_KILL\_SET} è possibile impostare
339   con il contenuto di \param{arg3} una politica specifica del processo
340   chiamante. Si può tornare alla politica di default del sistema utilizzando
341   invece per \param{arg2} il valore \constd{PR\_MCE\_KILL\_CLEAR}. In tutti i
342   casi, per compatibilità con eventuali estensioni future, tutti i valori
343   degli argomenti non utilizzati devono essere esplicitamente posti a zero,
344   pena il fallimento della chiamata con un errore di \errval{EINVAL}.
345   
346   In caso di impostazione di una politica specifica del processo con
347   \const{PR\_MCE\_KILL\_SET} i valori di \param{arg3} possono essere soltanto
348   due, che corrispondono anche al valore che si trova nell'impostazione
349   generale di sistema di \texttt{memory\_failure\_early\_kill}, con
350   \constd{PR\_MCE\_KILL\_EARLY} si richiede l'emissione immediata di
351   \signal{SIGBUS} non appena viene rilevato un errore, mentre con
352   \constd{PR\_MCE\_KILL\_LATE} il segnale verrà inviato solo quando il processo
353   tenterà un accesso alla memoria corrotta. Questi due valori corrispondono
354   rispettivamente ai valori 1 e 0 di
355   \texttt{memory\_failure\_early\_kill}.\footnote{in sostanza nel primo caso
356     viene immediatamente inviato il segnale a tutti i processi che hanno la
357     memoria corrotta mappata all'interno del loro spazio degli indirizzi, nel
358     secondo caso prima la pagina di memoria viene tolta dallo spazio degli
359     indirizzi di ciascun processo, mentre il segnale viene inviato solo quei
360     processi che tentano di accedervi.} Si può usare per \param{arg3} anche un
361   terzo valore, \constd{PR\_MCE\_KILL\_DEFAULT}, che corrisponde a impostare
362   per il processo la politica di default.\footnote{si presume la politica di
363     default corrente, in modo da non essere influenzati da un eventuale
364     successivo cambiamento della stessa.} Introdotta a partire dal kernel
365   2.6.32.
366 \item[\constd{PR\_MCE\_KILL\_GET}] Ottiene come valore di ritorno della
367   funzione la politica di gestione degli errori dovuti a corruzione della
368   memoria. Tutti gli argomenti non utilizzati (al momento tutti) devono essere
369   nulli pena la ricezione di un errore di \errval{EINVAL}. Introdotta a
370   partire dal kernel 2.6.32.
371 \itindbeg{child~reaper}
372 \item[\constd{PR\_SET\_CHILD\_SUBREAPER}] Se \param{arg2} è diverso da zero
373   imposta l'attributo di \textit{child reaper} per il processo, se nullo lo
374   cancella. Lo stato di \textit{child reaper} è una funzionalità, introdotta
375   con il kernel 3.4, che consente di far svolgere al processo che ha questo
376   attributo il ruolo di ``\textsl{genitore adottivo}'' per tutti i processi
377   suoi ``\textsl{discendenti}'' che diventano orfani, in questo modo il
378   processo potrà ricevere gli stati di terminazione alla loro uscita,
379   sostituendo in questo ruolo \cmd{init} (si ricordi quanto illustrato in
380   sez.~\ref{sec:proc_termination}). Il meccanismo è stato introdotto ad uso
381   dei programmi di gestione dei servizi, per consentire loro di ricevere gli
382   stati di terminazione di tutti i processi che lanciano, anche se questi
383   eseguono una doppia \func{fork}; nel comportamento ordinario infatti questi
384   verrebbero adottati da \cmd{init} ed il programma che li ha lanciati non
385   sarebbe più in grado di riceverne lo stato di terminazione. Se un processo
386   con lo stato di \textit{child reaper} termina prima dei suoi discendenti,
387   svolgerà questo ruolo il più prossimo antenato ad avere lo stato di
388   \textit{child reaper}, 
389 \item[\constd{PR\_GET\_CHILD\_SUBREAPER}] Ottiene l'impostazione relativa allo
390   lo stato di \textit{child reaper} del processo chiamante, salvata come
391   \textit{value result} all'indirizzo puntato da \param{arg2} (da indicare
392   come di tipo \code{int *}). Il valore viene letto come valore logico, se
393   diverso da 0 lo stato di \textit{child reaper} è attivo altrimenti è
394   disattivo. Introdotta a partire dal kernel 3.4.
395 \itindend{child~reaper}
396
397
398 % TODO documentare PR_MPX_INIT e PR_MPX_RELEASE, vedi
399 % http://lwn.net/Articles/582712/ 
400
401 % TODO documentare PR_SET_MM_MAP aggiunta con il kernel 3.18, per impostare i
402 % parametri di base del layout dello spazio di indirizzi di un processo (area
403 % codice e dati, stack, brack pointer ecc. vedi
404 % http://git.kernel.org/linus/f606b77f1a9e362451aca8f81d8f36a3a112139e 
405
406 % TODO documentare ARCH_SET_CPUID e ARCH_GET_CPUID, introdotte con il kernel
407 % 4.12, vedi https://lwn.net/Articles/721182/
408 \label{sec:prctl_operation}
409 \end{basedescript}
410
411
412 %\subsection{La funzione \func{ptrace}}
413 %\label{sec:process_ptrace}
414
415 %Da fare
416
417 % TODO: trattare PTRACE_SEIZE, aggiunta con il kernel 3.1
418 % TODO: trattare PTRACE_O_EXITKILL, aggiunta con il kernel 3.8 (vedi
419 % http://lwn.net/Articles/529060/) 
420 % TODO: trattare PTRACE_GETSIGMASK e PTRACE_SETSIGMASK introdotte con il
421 % kernel 3.11
422 % TODO: trattare PTRACE_O_SUSPEND_SECCOMP, aggiunta con il kernel 4.3, vedi
423 % http://lwn.net/Articles/656675/ 
424
425
426 \section{La gestione avanzata della creazione dei processi}
427 \label{sec:process_adv_creation}
428
429 In questa sezione tratteremo le funzionalità avanzate relative alla creazione
430 dei processi e del loro ambiente, sia per quanto riguarda l'utilizzo delle
431 stesse per la creazione dei \textit{thread} che per la gestione dei
432 \textit{namespace} che sono alla base dei cosidetti \textit{container}.
433
434
435 \subsection{La \textit{system call} \func{clone}}
436 \label{sec:process_clone}
437
438 La funzione tradizionale con cui creare un nuovo processo in un sistema
439 Unix-like, come illustrato in sez.~\ref{sec:proc_fork}, è \func{fork}, ma con
440 l'introduzione del supporto del kernel per i \textit{thread}\unavref{ (vedi
441   cap.~\ref{cha:threads})}, si è avuta la necessità di una interfaccia che
442 consentisse un maggiore controllo sulla modalità con cui vengono creati nuovi
443 processi, che poi è stata utilizzata anche per fornire supporto per le
444 tecnologie di virtualizzazione dei processi (i cosiddetti \textit{container})
445 su cui torneremo in sez.~\ref{sec:process_namespaces}.
446
447 Per questo l'interfaccia per la creazione di un nuovo processo è stata
448 delegata ad una nuova \textit{system call}, \funcm{sys\_clone}, che consente
449 di reimplementare anche la tradizionale \func{fork}. In realtà in questo caso
450 più che di nuovi processi si può parlare della creazioni di nuovi
451 ``\textit{task}'' del kernel che possono assumere la veste sia di un processo
452 classico isolato dagli altri come quelli trattati finora, che di un
453 \textit{thread} in cui la memoria viene condivisa fra il processo chiamante ed
454 il nuovo processo creato, come quelli che vedremo in
455 sez.~\ref{sec:linux_thread}. Per evitare confusione fra \textit{thread} e
456 processi ordinari, abbiamo deciso di usare la nomenclatura \textit{task} per
457 indicare la unità di esecuzione generica messa a disposizione del kernel che
458 \texttt{sys\_clone} permette di creare.
459
460 La \textit{system call} richiede soltanto due argomenti: il
461 primo, \param{flags}, consente di controllare le modalità di creazione del
462 nuovo \textit{task}, il secondo, \param{child\_stack}, imposta l'indirizzo
463 dello \textit{stack} per il nuovo \textit{task}, e deve essere indicato quando
464 si intende creare un \textit{thread}. L'esecuzione del programma creato da
465 \func{sys\_clone} riprende, come per \func{fork}, da dopo l'esecuzione della
466 stessa.
467
468 La necessità di avere uno \textit{stack} alternativo c'è solo quando si
469 intende creare un \textit{thread}, in tal caso infatti il nuovo \textit{task}
470 vede esattamente la stessa memoria del \textit{task}
471 ``\textsl{padre}'',\footnote{in questo caso per padre si intende semplicemente
472   il \textit{task} che ha eseguito \func{sys\_clone} rispetto al \textit{task}
473   da essa creato, senza nessuna delle implicazioni che il concetto ha per i
474   processi.} e nella sua esecuzione alla prima chiamata di una funzione
475 andrebbe a scrivere sullo \textit{stack} usato anche dal padre (si ricordi
476 quanto visto in sez.~\ref{sec:proc_mem_layout} riguardo all'uso dello
477 \textit{stack}).
478
479 Per evitare di doversi garantire contro la evidente possibilità di
480 \textit{race condition} che questa situazione comporta (vedi
481 sez.~\ref{sec:proc_race_cond} per una spiegazione della problematica) è
482 necessario che il chiamante allochi preventivamente un'area di memoria.  In
483 genere lo si fa con una \func{malloc} che allochi un buffer che la funzione
484 imposterà come \textit{stack} del nuovo processo, avendo ovviamente cura di
485 non utilizzarlo direttamente nel processo chiamante.
486
487 In questo modo i due \textit{task} avranno degli \textit{stack} indipendenti e
488 non si dovranno affrontare problematiche di \textit{race condition}.  Si tenga
489 presente inoltre che in molte architetture di processore lo \textit{stack}
490 cresce verso il basso, pertanto in tal caso non si dovrà specificare
491 per \param{child\_stack} il puntatore restituito da \func{malloc}, ma un
492 puntatore alla fine del buffer da essa allocato.
493
494 Dato che tutto ciò è necessario solo per i \textit{thread} che condividono la
495 memoria, la \textit{system call}, a differenza della funzione di libreria che
496 vedremo a breve, consente anche di passare per \param{child\_stack} il valore
497 \val{NULL}, che non imposta un nuovo \textit{stack}. Se infatti si crea un
498 processo, questo ottiene un suo nuovo spazio degli indirizzi (è sottinteso
499 cioè che non si stia usando il flag \const{CLONE\_VM} che vedremo a breve) ed
500 in questo caso si applica la semantica del \textit{copy on write} illustrata
501 in sez.~\ref{sec:proc_fork}, per cui le pagine dello \textit{stack} verranno
502 automaticamente copiate come le altre e il nuovo processo avrà un suo
503 \textit{stack} totalmente indipendente da quello del padre.
504
505 Dato che l'uso principale della nuova \textit{system call} è quello relativo
506 alla creazione dei \textit{thread}, la \acr{glibc} definisce una funzione di
507 libreria con una sintassi diversa, orientata a questo scopo, e la
508 \textit{system call} resta accessibile solo se invocata esplicitamente come
509 visto in sez.~\ref{sec:proc_syscall}.\footnote{ed inoltre per questa
510   \textit{system call} non è disponibile la chiamata veloce con
511   \texttt{vsyscall}.} La funzione di libreria si chiama semplicemente
512 \funcd{clone} ed il suo prototipo è:
513
514 \begin{funcproto}{ 
515 \fhead{sched.h}
516 \fdecl{int clone(int (*fn)(void *), void *child\_stack, int flags, void *arg,
517   ...  \\
518 \phantom{int clone(}/* pid\_t *ptid, struct user\_desc *tls, pid\_t *ctid */ )}
519 \fdesc{Crea un nuovo processo o \textit{thread}.} 
520 }
521 {La funzione ritorna il \textit{Thread ID} assegnato al nuovo processo in caso
522   di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà uno dei
523   valori: 
524 \begin{errlist}
525     \item[\errcode{EAGAIN}] sono già in esecuzione troppi processi.
526     \item[\errcode{EINVAL}] si è usata una combinazione non valida di flag o
527       un valore nullo per \param{child\_stack}.
528     \item[\errcode{ENOMEM}] non c'è memoria sufficiente per creare una nuova
529       \texttt{task\_struct} o per copiare le parti del contesto del chiamante
530       necessarie al nuovo \textit{task}.
531     \item[\errcode{EPERM}] non si hanno i privilegi di amministratore
532       richiesti dai flag indicati.
533 \end{errlist}}
534 \end{funcproto}
535
536 % NOTE: una pagina con la descrizione degli argomenti:
537 % * http://www.lindevdoc.org/wiki/Clone 
538
539 La funzione prende come primo argomento \param{fn} il puntatore alla funzione
540 che verrà messa in esecuzione nel nuovo processo, che può avere un unico
541 argomento di tipo puntatore a \ctyp{void}, il cui valore viene passato dal
542 terzo argomento \param{arg}. Per quanto il precedente prototipo possa
543 intimidire nella sua espressione, in realtà l'uso è molto semplice basterà
544 definire una qualunque funzione \param{fn} che restituisce un intero ed ha
545 come argomento un puntatore a \ctyp{void}, e \code{fn(arg)} sarà eseguita in
546 un nuovo processo.
547
548 Il nuovo processo resterà in esecuzione fintanto che la funzione \param{fn}
549 non ritorna, o esegue \func{exit} o viene terminata da un segnale. Il valore
550 di ritorno della funzione (o quello specificato con \func{exit}) verrà
551 utilizzato come stato di uscita della funzione. I tre
552 argomenti \param{ptid}, \param{tls} e \param{ctid} sono opzionali e sono
553 presenti solo a partire dal kernel 2.6 e sono stati aggiunti come supporto per
554 le funzioni di gestione dei \textit{thread} (la \textit{Native Thread Posix
555   Library}, vedi sez.~\ref{sec:linux_ntpl}) nella \acr{glibc}, essi vengono
556 utilizzati soltanto se si sono specificati rispettivamente i flag
557 \const{CLONE\_PARENT\_SETTID}, \const{CLONE\_SETTLS} e
558 \const{CLONE\_CHILD\_SETTID}. 
559
560 La funzione ritorna un l'identificatore del nuovo \textit{task}, denominato
561 \texttt{Thread ID} (da qui in avanti \ids{TID}) il cui significato è analogo
562 al \ids{PID} dei normali processi e che a questo corrisponde qualora si crei
563 un processo ordinario e non un \textit{thread}.
564
565 Il comportamento di \func{clone}, che si riflette sulle caratteristiche del
566 nuovo processo da essa creato, è controllato principalmente
567 dall'argomento \param{flags}, che deve essere specificato come maschera
568 binaria, ottenuta con un OR aritmetico di una delle costanti del seguente
569 elenco, che illustra quelle attualmente disponibili:\footnote{si fa
570   riferimento al momento della stesura di questa sezione, cioè con il kernel
571   3.2.}
572
573 \begin{basedescript}{\desclabelwidth{1.5 cm}\desclabelstyle{\nextlinelabel}}
574
575 \item[\constd{CLONE\_CHILD\_CLEARTID}] cancella il valore del \textit{thread
576     ID} posto all'indirizzo dato dall'argomento \param{ctid}, eseguendo un
577   riattivazione del \textit{futex} (vedi sez.~\ref{sec:xxx_futex}) a
578   quell'indirizzo. Questo flag viene utilizzato dalla librerie di gestione dei
579   \textit{thread} ed è presente dal kernel 2.5.49.
580
581 \item[\constd{CLONE\_CHILD\_SETTID}] scrive il \ids{TID} del \textit{thread}
582   figlio all'indirizzo dato dall'argomento \param{ctid}. Questo flag viene
583   utilizzato dalla librerie di gestione dei \textit{thread} ed è presente dal
584   kernel 2.5.49.
585
586 \item[\constd{CLONE\_FILES}] se impostato il nuovo processo condividerà con il
587   padre la \textit{file descriptor table} (vedi sez.~\ref{sec:file_fd}),
588   questo significa che ogni \textit{file descriptor} aperto da un processo
589   verrà visto anche dall'altro e che ogni chiusura o cambiamento dei
590   \textit{file descriptor flag} di un \textit{file descriptor} verrà per
591   entrambi.
592
593   Se non viene impostato il processo figlio eredita una copia della
594   \textit{file descriptor table} del padre e vale la semantica classica della
595   gestione dei \textit{file descriptor}, che costituisce il comportamento
596   ordinario di un sistema unix-like e che illustreremo in dettaglio in
597   sez.~\ref{sec:file_shared_access}.
598
599 \item[\constd{CLONE\_FS}] se questo flag viene impostato il nuovo processo
600   condividerà con il padre le informazioni relative all'albero dei file, ed in
601   particolare avrà la stessa radice (vedi sez.~\ref{sec:file_chroot}), la
602   stessa directory di lavoro (vedi sez.~\ref{sec:file_work_dir}) e la stessa
603   \textit{umask} (sez.~\ref{sec:file_perm_management}). Una modifica di una
604   qualunque di queste caratteristiche in un processo, avrà effetto anche
605   sull'altro. Se assente il nuovo processo riceverà una copia delle precedenti
606   informazioni, che saranno così indipendenti per i due processi, come avviene
607   nel comportamento ordinario di un sistema unix-like.
608
609 \item[\constd{CLONE\_IO}] se questo flag viene impostato il nuovo il nuovo
610   processo condividerà con il padre il contesto dell'I/O, altrimenti, come
611   come avviene nel comportamento ordinario con una \func{fork} otterrà un suo
612   contesto dell'I/O. 
613
614   Il contesto dell'I/O viene usato dagli \textit{scheduler} di I/O (visti in
615   sez.~\ref{sec:io_priority}) e se questo è lo stesso per diversi processi
616   questi vengono trattati come se fossero lo stesso, condividendo il tempo per
617   l'accesso al disco, e possono interscambiarsi nell'accesso a disco. L'uso di
618   questo flag consente, quando più \textit{thread} eseguono dell'I/O per conto
619   dello stesso processo (ad esempio con le funzioni di I/O asincrono di
620   sez.~\ref{sec:file_asyncronous_io}), migliori prestazioni.
621
622 %TODO : tutti i CLONE_NEW* attengono ai namespace, ed è meglio metterli nella
623 %relativa sezione da creare a parte
624
625 % \item[\constd{CLONE\_NEWIPC}] è uno dei flag ad uso dei \textit{container},
626 %   introdotto con il kernel 2.6.19. L'uso di questo flag crea per il nuovo
627 %   processo un nuovo \textit{namespace} per il sistema di IPC, sia per quello
628 %   di SysV (vedi sez.~\ref{sec:ipc_sysv}) che, dal kernel 2.6.30, per le code
629 %   di messaggi POSIX (vedi sez.~\ref{sec:ipc_posix_mq}); si applica cioè a
630 %   tutti quegli oggetti che non vegono identificati con un \textit{pathname}
631 %   sull'albero dei file.
632
633 %   L'uso di questo flag richiede privilegi di amministratore (più precisamente
634 %   la capacità \const{CAP\_SYS\_ADMIN}) e non può essere usato in combinazione
635 %   con \const{CLONE\_SYSVSEM}. 
636
637 % \item[\constd{CLONE\_NEWNET}]
638 % \item[\constd{CLONE\_NEWNS}]
639 % \item[\constd{CLONE\_NEWPID}]
640 % \item[\constd{CLONE\_NEWUTS}]
641
642
643 % TODO trattare CLONE_NEWCGROUP introdotto con il kernel 4.6, vedi
644 % http://lwn.net/Articles/680566/ 
645
646 \item[\constd{CLONE\_PARENT}]
647 \item[\constd{CLONE\_PARENT\_SETTID}]
648 \item[\constd{CLONE\_PID}]
649
650 \item[\constd{CLONE\_PTRACE}] se questo flag viene impostato ed il processo
651   chiamante viene tracciato (vedi sez.~\ref{sec:process_ptrace}) anche il
652   figlio viene tracciato. 
653
654 \item[\constd{CLONE\_SETTLS}]
655 \item[\constd{CLONE\_SIGHAND}]
656 \item[\constd{CLONE\_STOPPED}]
657 \item[\constd{CLONE\_SYSVSEM}]
658 \item[\constd{CLONE\_THREAD}]
659
660 \item[\constd{CLONE\_UNTRACED}] se questo flag viene impostato un processo non
661   può più forzare \const{CLONE\_PTRACE} su questo processo.
662
663 \item[\constd{CLONE\_VFORK}] se questo flag viene impostato il chiamante viene
664   fermato fintato che il figlio appena creato non rilascia la sua memoria
665   virtuale con una chiamata a \func{exec} o \func{exit}, viene quindi
666   replicato il comportamento di \func{vfork}.
667
668 \item[\constd{CLONE\_VM}] se questo flag viene impostato il nuovo processo
669   condividerà con il padre la stessa memoria virtuale, e le scritture in
670   memoria fatte da uno qualunque dei processi saranno visibili dall'altro,
671   così come ogni mappatura in memoria (vedi sez.~\ref{sec:file_memory_map}). 
672
673   Se non viene impostato il processo figlio otterrà una copia dello spazio
674   degli indirizzi e si otterrà il comportamento ordinario di un processo di un
675   sistema unix-like creato con la funzione \func{fork}.
676 \end{basedescript}
677
678
679
680 \subsection{La gestione dei \textit{namespace}}
681 \label{sec:process_namespaces}
682
683 \itindbeg{namespace}
684 Come accennato all'inizio di sez.~\ref{sec:process_clone} oltre al controllo
685 delle caratteristiche dei processi usate per la creazione dei \textit{thread},
686 l'uso di \func{clone} consente, ad uso delle nuove funzionalità di
687 virtualizzazione dei processi, di creare nuovi ``\textit{namespace}'' per una
688 serie di proprietà generali (come l'elenco dei \ids{PID}, l'albero dei file, i
689 \textit{mount point}, la rete, il sistema di IPC, ecc.).
690
691 L'uso dei ``\textit{namespace}'' consente creare gruppi di processi che vedono
692 le suddette proprietà in maniera indipendente fra loro. I processi di ciascun
693 gruppo vengono così eseguiti come in una sorta di spazio separato da quello
694 degli altri gruppi, che costituisce poi quello che viene chiamato un
695 \textit{container}.
696
697 \itindend{namespace}
698
699
700 \itindbeg{container}
701
702 \itindend{container}
703
704
705 %TODO sezione separata sui namespace 
706
707 %TODO trattare unshare, vedi anche http://lwn.net/Articles/532748/
708
709 %TODO: trattare la funzione setns e i namespace file descriptors (vedi
710 % http://lwn.net/Articles/407495/) introdotti con il kernel 3.0, altre
711 % informazioni su setns qui: http://lwn.net/Articles/532748/
712 % http://lwn.net/Articles/531498/
713
714
715 \section{La gestione avanzata della sicurezza}
716 \label{sec:process_security}
717
718 Tratteremo in questa sezione le funzionalità più avanzate relative alla
719 gestione della sicurezza, a partire dalle \textit{capabilities} e dalle
720 funzionalità di \textit{Secure Computing}, fino alle funzionalità relative
721 alla gestione delle chiavi crittografiche.
722
723
724 % TODO: trattare keyctl (man 2 keyctl)
725
726 % TODO trattare le funzioni di protezione della memoria pkey_alloc, pkey_free,
727 % pkey_mprotect, introdotte con il kernel 4.8, vedi
728 % http://lwn.net/Articles/689395/ e Documentation/x86/protection-keys.txt 
729
730 %TODO trattare kcmp aggiunta con il kernel 3.5, vedi
731 % https://lwn.net/Articles/478111/
732
733
734 \section{Funzionalità avanzate e specialistiche}
735 \label{sec:process_special}
736
737
738
739 \subsection{La gestione delle operazioni in virgola mobile}
740 \label{sec:process_fenv}
741
742 Da fare.
743
744 % TODO eccezioni ed arrotondamenti per la matematica in virgola mobile 
745 % consultare la manpage di fenv, math_error, fpclassify, matherr, isgreater,
746 % isnan, nan, INFINITY
747
748
749 \subsection{L'accesso alle porte di I/O}
750 \label{sec:process_io_port}
751
752 %
753 % TODO l'I/O sulle porte di I/O 
754 % consultare le manpage di ioperm, iopl e outb
755 % non c'entra nulla qui, va trovato un altro posto (altri meccanismi di I/O in
756 % fileintro ?)
757
758 Da fare
759
760
761 %\subsection{La gestione di architetture a nodi multipli}
762 %\label{sec:process_NUMA}
763
764 % TODO trattare i cpuset, che attiene anche a NUMA, e che possono essere usati
765 % per associare l'uso di gruppi di processori a gruppi di processi (vedi
766 % manpage omonima)
767 % TODO trattare getcpu, che attiene anche a NUMA, mettere qui anche
768 % sched_getcpu, che potrebbe essere indipendente ma richiama getcpu
769
770 %TODO trattare le funzionalità per il NUMA
771 % vedi man numa e, mbind, get_mempolicy, set_mempolicy, 
772 % le pagine di manuale relative
773 % vedere anche dove metterle...
774
775 % \subsection{La gestione dei moduli}
776 % \label{sec:kernel_modules}
777
778 % da fare
779
780 %TODO trattare init_module e finit_module (quest'ultima introdotta con il
781 %kernel 3.8)
782
783 %%%% Altre cose di cui non è chiara la collocazione:
784
785 %TODO trattare membarrier, introdotta con il kernel 4.3
786 % vedi http://lwn.net/Articles/369567/ http://lwn.net/Articles/369640/
787 % http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=5b25b13ab08f616efd566347d809b4ece54570d1 
788 % vedi anche l'ulteriore opzione "expedited" introdotta con il kernel 4.14
789 % (https://lwn.net/Articles/728795/) 
790
791
792
793 %%% Local Variables:
794 %%% mode: latex
795 %%% TeX-master: "gapil"
796 %%% End: