X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=prochand.tex;h=78ad88dc6a075976334798c187b67e4d38c74f03;hb=07e172e1a0a23e896faa1b87bea92bf4871ae01b;hp=8113d7f095f6f82e73022095fc1fcea78c472150;hpb=e2f92e43947fa40f05fd7d07b0a6a3a95c0a11b4;p=gapil.git diff --git a/prochand.tex b/prochand.tex index 8113d7f..78ad88d 100644 --- a/prochand.tex +++ b/prochand.tex @@ -138,7 +138,7 @@ fig.~\ref{fig:proc_task_struct}. \begin{figure}[htb] \centering - \includegraphics[width=12cm]{img/task_struct} + \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} @@ -670,7 +670,7 @@ Le differenze fra padre e figlio dopo la \func{fork} invece sono:\footnote{a sez.~\ref{sec:sig_notification}), che non vengono ereditate dal figlio; \item le mappature di memoria marcate come \const{MADV\_DONTFORK} (vedi sez.~\ref{sec:file_memory_map}) che non vengono ereditate dal figlio; -\item l'impostazione con \func{prctl} (vedi sez.~\ref{sec:prctl_xxx}) che +\item l'impostazione con \func{prctl} (vedi sez.~\ref{sec:process_prctl}) che notifica al figlio la terminazione del padre viene cancellata; \item il segnale di terminazione del figlio è sempre \const{SIGCHLD} anche qualora nel padre fosse stato modificato (vedi sez.~\ref{sec:process_clone}). @@ -868,8 +868,7 @@ terminare il processo che li ha generati, in modo che \cmd{init} possa adottarli e provvedere a concluderne la terminazione. -\subsection{La funzione \func{waitpid} e le funzioni di ricezione degli stati - di uscita} +\subsection{Le funzioni di attesa e ricezione degli stati di uscita} \label{sec:proc_wait} Uno degli usi più comuni delle capacità multitasking di un sistema unix-like @@ -878,8 +877,8 @@ principale attende le richieste che vengono poi soddisfatte da una serie di processi figli. Si è già sottolineato al paragrafo precedente come in questo caso diventi necessario gestire esplicitamente la conclusione dei figli onde evitare di riempire di \index{zombie} \textit{zombie} la tabella dei processi; -le funzioni deputate a questo compito sono principalmente due, \funcd{wait} e -\func{waitpid}. La prima, il cui prototipo è: +le funzioni deputate a questo compito sono principalmente due, la prima è +\funcd{wait} ed il suo prototipo è: \begin{functions} \headdecl{sys/types.h} \headdecl{sys/wait.h} @@ -895,16 +894,20 @@ segnale termina il processo o chiama una funzione di gestione. \end{errlist}} \end{functions} \noindent -è presente fin dalle prime versioni di Unix; la funzione ritorna non appena un -processo figlio termina. Se un figlio è già terminato la funzione ritorna -immediatamente, se più di un figlio è terminato occorre chiamare la funzione -più volte se si vuole recuperare lo stato di terminazione di tutti quanti. + +Questa funzione è presente fin dalle prime versioni di Unix; essa ritorna non +appena un qualunque processo figlio termina. Se un figlio è già terminato +prima della chiamata la funzione ritorna immediatamente, se più di un figlio è +già terminato occorre continuare chiamare la funzione più volte se si vuole +recuperare lo stato di terminazione di tutti quanti. Al ritorno della funzione lo stato di terminazione del figlio viene salvato nella variabile puntata da \param{status} e tutte le risorse del kernel -relative al processo (vedi sez.~\ref{sec:proc_termination}) vengono rilasciate. -Nel caso un processo abbia più figli il valore di ritorno (il \acr{pid} del -figlio) permette di identificare qual è quello che è uscito. +relative al processo (vedi sez.~\ref{sec:proc_termination}) vengono +rilasciate. Nel caso un processo abbia più figli il valore di ritorno della +funzione sarà impostato al \acr{pid} del processo di cui si è ricevuto lo +stato di terminazione, cosa che permette di identificare qual è il figlio che +è terminato. Questa funzione ha il difetto di essere poco flessibile, in quanto ritorna all'uscita di un qualunque processo figlio. Nelle occasioni in cui è @@ -913,14 +916,14 @@ predisporre un meccanismo che tenga conto dei processi già terminati, e provvedere a ripetere la chiamata alla funzione nel caso il processo cercato sia ancora attivo. -Per questo motivo lo standard POSIX.1 ha introdotto la funzione -\funcd{waitpid} che effettua lo stesso servizio, ma dispone di una serie di -funzionalità più ampie, legate anche al controllo di sessione (si veda +Per questo motivo lo standard POSIX.1 ha introdotto una seconda funzione che +effettua lo stesso servizio, ma dispone di una serie di funzionalità più +ampie, legate anche al controllo di sessione (si veda sez.~\ref{sec:sess_job_control}). Dato che è possibile ottenere lo stesso comportamento di \func{wait}\footnote{in effetti il codice \code{wait(\&status)} è del tutto equivalente a \code{waitpid(WAIT\_ANY, - \&status, 0)}.} si consiglia di utilizzare sempre questa funzione, il cui -prototipo è: + \&status, 0)}.} si consiglia di utilizzare sempre questa nuova funzione, +\funcd{waitpid}, il cui prototipo è: \begin{functions} \headdecl{sys/types.h} \headdecl{sys/wait.h} @@ -1032,11 +1035,11 @@ quando un processo figlio entra nello stato \textit{stopped}\footnote{in realtà viene notificato soltanto il caso in cui il processo è stato fermato da un segnale di stop (vedi sez.~\ref{sec:sess_ctrl_term}), e non quello in cui lo stato \textit{stopped} è dovuto all'uso di \func{ptrace} (vedi - sez.~\ref{sec:xxx_ptrace}).} (vedi tab.~\ref{tab:proc_proc_states}), mentre -con \const{WCONTINUED} la funzione ritorna quando un processo in stato + sez.~\ref{sec:process_ptrace}).} (vedi tab.~\ref{tab:proc_proc_states}), +mentre con \const{WCONTINUED} la funzione ritorna quando un processo in stato \textit{stopped} riprende l'esecuzione per la ricezione del segnale \const{SIGCONT} (l'uso di questi segnali per il controllo di sessione è -dettagliato in sez.~\ref{sec:sess_ctrl_term}). +dettagliato in sez.~\ref{sec:sess_ctrl_term}). La terminazione di un processo figlio (così come gli altri eventi osservabili con \func{waitpid}) è chiaramente un evento asincrono rispetto all'esecuzione @@ -1539,11 +1542,11 @@ nell'esecuzione della funzione \func{exec}, queste sono: sez.~\ref{sec:thread_xxx}) sono cancellati e tutti gli oggetti ad essi relativi (vedi sez.~\ref{sec:thread_xxx}) rimossi; \item viene impostato il flag \const{PR\_SET\_DUMPABLE} di \func{prctl} (vedi - sez.~\ref{sec:prctl_xxx}) a meno che il programma da eseguire non sia + sez.~\ref{sec:process_prctl}) a meno che il programma da eseguire non sia \itindex{suid~bit} \acr{suid} o \itindex{sgid~bit} \acr{sgid} (vedi sez.~\ref{sec:proc_access_id}); \item il flag \const{PR\_SET\_KEEPCAPS} di \func{prctl} (vedi - sez.~\ref{sec:prctl_xxx}) viene cancellato; + sez.~\ref{sec:process_prctl}) viene cancellato; \item il nome del processo viene impostato al nome del file contenente il programma messo in esecuzione; \item il segnale di terminazione viene reimpostato a \const{SIGCHLD}; @@ -3262,11 +3265,14 @@ dei processi che gli appartengono,\footnote{per la modifica delle priorità di altri processi occorrono privilegi amministrativi, ed in particolare la capacità \const{CAP\_SYS\_NICE} (vedi sez.~\ref{sec:proc_capabilities}).} cioè quelli il cui user-ID reale corrisponde all'user-ID reale o effettivo del -chiamante. Data la possibilità di ottenere un blocco totale dello stesso, solo +chiamante. Data la possibilità di ottenere un blocco totale del sistema, solo l'amministratore\footnote{o un processo con la capacità \const{CAP\_SYS\_ADMIN} (vedi sez.~\ref{sec:proc_capabilities}).} può impostare un processo ad una priorità di I/O nella classe -\const{IOPRIO\_CLASS\_RT} o \const{IOPRIO\_CLASS\_IDLE}. +\const{IOPRIO\_CLASS\_RT}, lo stesso privilegio era richiesto anche per la +classe \const{IOPRIO\_CLASS\_IDLE} fino al kernel 2.6.24, ma dato che in +questo caso non ci sono effetti sugli altri processi questo limite è stato +rimosso a partire dal kernel 2.6.25. %TODO verificare http://lwn.net/Articles/355987/ @@ -3274,6 +3280,319 @@ impostare un processo ad una priorità di I/O nella classe % vedi man numa e le pagine di manuale relative % vedere anche dove metterle... + +\section{Funzioni di gestione avanzata} +\label{sec:proc_advanced_control} + +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 +di essa in un secondo tempo. + +\subsection{La system call \func{clone}} +\label{sec:process_clone} + +Da fare + +\subsection{La funzione \func{prctl}} +\label{sec:process_prctl} + +Benché la gestione ordinaria possa essere effettuata attraverso le funzioni +che abbiamo già esaminato nelle sezioni precedenti, esistono una serie di +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 esiste una analoga in + IRIX, è stata introdotta con il kernel 2.1.57.} +\begin{functions} + \headdecl{sys/prctl.h} + + \funcdecl{int prctl(int option, unsigned long arg2, unsigned long arg3, + unsigned long arg4, unsigned long arg5)} + + Esegue una operazione speciale sul processo corrente. + + \bodydesc{La funzione ritorna 0 o un valore positivo dipendente + dall'operazione in caso di successo e $-1$ in caso di errore, nel qual + caso \var{errno} assumerà valori diversi a seconda del tipo di operazione + richiesta (in genere \errval{EINVAL} o \errval{EPERM}). } +\end{functions} + +La funzione ritorna un valore nullo o positivo in caso di successo e $-1$ in +caso di errore; il significato degli argomenti della funzione successivi al +primo, il valore di ritorno in caso di successo, il tipo di errore restituito +in \var{errno} dipendono dall'operazione eseguita, indicata tramite il primo +argomento, \param{option}. Questo è un valore intero che identifica +l'operazione, e deve essere specificato con l'uso di una delle costanti +predefinite del seguente elenco, che illustra quelle disponibili al momento: + +\begin{basedescript}{\desclabelstyle{\pushlabel}} +\item[\const{PR\_CAPBSET\_READ}] Controlla la disponibilità di una delle + \textit{capabilities} (vedi sez.~\ref{sec:proc_capabilities}). La funzione + ritorna 1 se la capacità specificata nell'argomento \param{arg2} (con una + delle costanti di tab.~\ref{tab:proc_capabilities}) è presente nel + \textit{capabilities bounding set} del processo e zero altrimenti, + se \param{arg2} non è un valore valido si avrà un errore di \errval{EINVAL}. + Introdotta a partire dal kernel 2.6.25. +\item[\const{PR\_CAPBSET\_DROP}] Rimuove permanentemente una delle + \textit{capabilities} (vedi sez.~\ref{sec:proc_capabilities}) dal processo e + da tutti i suoi discendenti. La funzione cancella la capacità specificata + 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 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 + sez.~\ref{sec:sig_standard}) lo genera effettivamente. In genere questo flag + viene attivato automaticamente, ma per evitare problemi di sicurezza (la + generazione di un file da parte di processi privilegiati può essere usata + per sovrascriverne altri) viene cancellato quando si mette in esecuzione un + programma con i bit \acr{suid} e \acr{sgid} attivi (vedi + sez.~\ref{sec:file_special_perm}) o con l'uso delle funzioni per la modifica + degli \textit{user-ID} dei processi (vedi + sez.~\ref{sec:proc_setuid}). L'operazione è stata introdotta a partire dal + kernel 2.3.20, fino al kernel 2.6.12 e per i kernel successivi al 2.6.17 era + possibile usare solo un valore 0 di \param{arg2} per disattivare il flag ed + un valore 1 per attivarlo, nei kernel dal 2.6.13 al 2.6.17 è stato + supportato anche il valore 2, che causava la generazione di un + \itindex{core~dump} \textit{core dump} leggibile solo + dall'amministratore.\footnote{la funzionalità è stata rimossa per motivi di + sicurezza, in quanto consentiva ad un utente normale di creare un file di + \textit{core dump} appartenente all'amministratore in directory dove + l'utente avrebbe avuto permessi di accesso.} +\item[\const{PR\_GET\_DUMPABLE}] Ottiene come valore di ritorno della funzione + lo stato corrente del flag che controlla la effettiva generazione dei + \itindex{core~dump} \textit{core dump}. Introdotta a partire dal kernel + 2.3.20. +\item[\const{PR\_SET\_ENDIAN}] Imposta la \textit{endianess} del processo + chiamante secondo il valore fornito in \param{arg2}. I valori possibili sono + sono: \const{PR\_ENDIAN\_BIG} (\textit{big endian}), + \const{PR\_ENDIAN\_LITTLE} (\textit{little endian}), e + \const{PR\_ENDIAN\_PPC\_LITTLE} (lo pseudo \textit{little endian} del + PowerPC). Introdotta a partire dal kernel 2.6.18, solo per architettura + PowerPC. +\item[\const{PR\_GET\_ENDIAN}] Ottiene il valore della \textit{endianess} del + processo chiamante, salvato sulla variabile puntata da \param{arg2} che deve + essere passata come di tipo \type{(int *)}. Introdotta a partire dal kernel + 2.6.18, solo su PowerPC. +\item[\const{PR\_SET\_FPEMU}] Imposta i bit di controllo per l'emulazione + della virgola mobile su architettura ia64, secondo il valore + 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} (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 + partire dal kernel 2.4.18, solo su ia64. +\item[\const{PR\_SET\_FPEXC}] Imposta la modalità delle eccezioni in virgola + mobile (\textit{floating-point exception mode}) al valore di \param{arg2}. + I valori possibili sono: \const{PR\_FP\_EXC\_SW\_ENABLE} per usare FPEXC per + le eccezioni, \const{PR\_FP\_EXC\_DIV} per la divisione per zero in virgola + mobile, \const{PR\_FP\_EXC\_OVF} per gli overflow, \const{PR\_FP\_EXC\_UND} + 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 eccezione + asincrona non recuperabile, \const{PR\_FP\_EXC\_ASYNC} per utilizzare la + 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. +\item[\const{PR\_GET\_FPEXC}] Ottiene il valore della modalità delle eccezioni + delle operazioni in virgola mobile, salvata all'indirizzo + puntato \param{arg2}, che deve essere di tipo \code{(int *)}. Introdotta a + partire dal kernel 2.4.21, solo su PowerPC. +\item[\const{PR\_SET\_KEEPCAPS}] Consente di controllare quali + \textit{capabilities} vengono cancellate quando si esegue un cambiamento di + \textit{user-ID} del processo (per i dettagli si veda + 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 + 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 + \const{PR\_SET\_KEEPCAPS}. Introdotta a partire dal kernel 2.2.18. +\item[\const{PR\_SET\_NAME}] Imposta il nome del processo chiamante alla + stringa puntata da \param{arg2}, che deve essere di tipo \code{(char *)}. Il + nome può essere lungo al massimo 16 caratteri, e la stringa deve essere + terminata da NUL se più corta. Introdotta a partire dal kernel 2.6.9. +\item[\const{PR\_GET\_NAME}] Ottiene il nome del processo chiamante nella + stringa puntata da \param{arg2}, che deve essere di tipo \code{(char *)}; si + devono allocare per questo almeno 16 byte, e il nome sarà terminato da NUL + 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; 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 + partire dal kernel 2.3.15. +\item[\const{PR\_SET\_SECCOMP}] Imposta il cosiddetto + \itindex{secure~computing~mode} \textit{secure computing mode} per il + processo corrente. Prevede come unica possibilità che \param{arg2} sia + impostato ad 1. Una volta abilitato il \textit{secure computing mode} il + 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} (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 + funzione è totalmente inutile in quanto l'unico valore ottenibile è 0, dato + che la chiamata di questa funzione in \textit{secure computing mode} + 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 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. +\item[\const{PR\_SET\_TIMING}] Imposta il metodo di temporizzazione del + processo da indicare con il valore di \param{arg2}, con + \const{PR\_TIMING\_STATISTICAL} si usa il metodo statistico tradizionale, + con \const{PR\_TIMING\_TIMESTAMP} il più accurato basato su dei + \textit{timestamp}, quest'ultimo però non è ancora implementato ed il suo + uso comporta la restituzione di un errore di \errval{EINVAL}. Introdotta a + partire dal kernel 2.6.0-test4. +\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 + 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} (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 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/, +% http://blog.cr0.org/2009/05/time-stamp-counter-disabling-oddities.html, +% 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 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}] 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} + + + + +\subsection{La funzione \func{ptrace}} +\label{sec:process_ptrace} + +Da fare + +\subsection{L'accesso alle porte di I/O} +\label{sec:process_io_port} + +% +% TODO l'I/O sulle porte di I/O +% consultare le manpage di ioperm, iopl e outb + +Da fare + +% TODO: funzioni varie sparse citate da qualche parte e da trattare forse in +% una sezione a parte: sigreturn, + + \section{Problematiche di programmazione multitasking} \label{sec:proc_multi_prog} @@ -3482,10 +3801,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 SIGCHL WALL big +% LocalWords: WNOTHREAD DUMPABLE KEEPCAPS IRIX CAPBSET endianess endian +% LocalWords: little PPC PowerPC FPEMU NOPRINT SIGFPE FPEXC point FP SW +% LocalWords: exception EXC ENABLE OVF overflow UND underflow RES INV DISABLED +% LocalWords: NONRECOV ASYNC KEEP securebits NAME NUL PDEATHSIG SECCOMP +% LocalWords: secure computing sigreturn TIMING STATISTICAL TSC MCE +% LocalWords: timestamp Stamp SIGSEGV UNALIGN SIGBUS MCEERR AO failure early %%% Local Variables: %%% mode: latex