-Come accennato le interfacce con cui i programmi possono accedere all'hardware
-vanno sotto il nome di chiamate al sistema (le cosiddette \textit{system
- call}), si tratta di un insieme di funzioni che un programma può chiamare,
-per le quali viene generata un'interruzione del processo passando il controllo
-dal programma al kernel. Sarà poi quest'ultimo che (oltre a compiere una serie
-di operazioni interne come la gestione del multitasking e l'allocazione della
-memoria) eseguirà la funzione richiesta in \textit{kernel space} restituendo i
-risultati al chiamante.
-
-Ogni versione di Unix ha storicamente sempre avuto un certo numero di queste
-chiamate, che sono riportate nella seconda sezione del \textsl{Manuale di
- programmazione di Unix} (quella cui si accede con il comando \cmd{man 2
- <nome>}) e Linux non fa eccezione. Queste sono poi state codificate da vari
-standard, che esamineremo brevemente in \secref{sec:intro_standard}. Uno
-schema elementare della struttura del sistema è riportato in
-\figref{fig:intro_sys_struct}.
-
-\begin{figure}[htb]
- \centering
- \includegraphics[width=10cm]{img/struct_sys}
- \caption{Schema di massima della struttura di interazione fra processi,
- kernel e dispositivi in Linux.}
- \label{fig:intro_sys_struct}
-\end{figure}
-
-Normalmente ciascuna di queste chiamate al sistema viene rimappata in
-opportune funzioni con lo stesso nome definite dentro la Libreria Standard del
-C, che, oltre alle interfacce alle system call, contiene anche tutta la serie
-delle ulteriori funzioni definite dai vari standard, che sono comunemente
-usate nella programmazione.
-
-Questo è importante da capire perché programmare in Linux significa anzitutto
-essere in grado di usare le varie interfacce contenute nella Libreria Standard
-del C, in quanto né il kernel, né il linguaggio C, implementano direttamente
-operazioni comuni come l'allocazione dinamica della memoria, l'input/output
-bufferizzato o la manipolazione delle stringhe, presenti in qualunque
-programma.
-
-Quanto appena illustrato mette in evidenza il fatto che nella stragrande
-maggioranza dei casi,\footnote{esistono implementazioni diverse delle librerie
- Standard del C, come le \textit{libc5} o le \textit{uClib}, che non derivano
- dal progetto GNU. Le \textit{libc5} oggi sono, tranne casi particolari,
- completamente soppiantate dalle \acr{glibc}, le \textit{uClib} pur non
- essendo complete come le \acr{glibc}, restano invece molto diffuse nel mondo
- embedded per le loro di dimensioni ridotte (e soprattutto la possibilità di
- togliere le parti non necessarie), e pertanto costituiscono un valido
- rimpiazzo delle \acr{glibc} in tutti quei sistemi specializzati che
- richiedono una minima occupazione di memoria.} si dovrebbe usare il nome
-GNU/Linux (piuttosto che soltanto Linux) in quanto una parte essenziale del
-sistema (senza la quale niente funzionerebbe) è la GNU Standard C Library (in
-breve \acr{glibc}), ovvero la libreria realizzata dalla Free Software
-Foundation nella quale sono state implementate tutte le funzioni essenziali
-definite negli standard POSIX e ANSI C, utilizzabili da qualunque programma.
-
-Le funzioni di questa libreria sono quelle riportate dalla terza sezione del
-\textsl{Manuale di Programmazione di Unix} (cioè accessibili con il comando
-\cmd{man 3 <nome>}) e sono costruite sulla base delle chiamate al sistema del
-kernel; è importante avere presente questa distinzione, fondamentale dal punto
-di vista dell'implementazione, anche se poi, nella realizzazione di normali
-programmi, non si hanno differenze pratiche fra l'uso di una funzione di
-libreria e quello di una chiamata al sistema.
-
+Come illustrato in fig.~\ref{fig:intro_sys_struct} i programmi possono
+accedere ai servizi forniti dal kernel tramite opportune interfacce dette
+\textit{system call} (\textsl{chiamate al sistema}, appunto). Si tratta di un
+insieme di funzioni che un programma può invocare, per le quali viene generata
+un'interruzione nell'esecuzione del codice del processo, passando il controllo
+al kernel. Sarà quest'ultimo che eseguirà in le operazioni relative alla
+funzione richiesta in \textit{kernel space}, restituendo poi i risultati al
+chiamante.
+
+Ogni versione di Unix ha storicamente sempre avuto un certo numero di
+\textit{system call}, che sono documentate nella seconda sezione del
+\textsl{Manuale di programmazione di Unix}, quella cui si accede con il
+comando \cmd{man 2 <nome>}, ed anche Linux non fa eccezione. Queste
+\textit{system call} sono poi state codificate da vari standard, che
+esamineremo brevemente in sez.~\ref{sec:intro_standard}.
+
+Normalmente ciascuna chiamata al sistema fornita dal kernel viene associata ad
+una funzione con lo stesso nome definita all'interno della libreria
+fondamentale del sistema, quella che viene chiamata \textsl{Libreria Standard
+ del C} (\textit{C Standard Library}) in ragione del fatto che il primo
+kernel Unix e tutti i programmi eseguiti su di esso vennero scritti in C,
+usando le librerie di questo linguaggio. Questa libreria, oltre alle
+interfacce delle \textit{system call}, contiene anche tutta una serie di
+ulteriori funzioni di utilità che vengono comunemente usate nella
+programmazione e sono definite nei vari standard che documentano le interfacce
+di programmazione di un sistema unix-like.
+
+Questo concetto è importante da tener presente perché programmare in Linux
+significa anzitutto essere in grado di usare le funzioni fornite dalla
+\textsl{Libreria Standard del C}, in quanto né il kernel, né il linguaggio C
+implementano direttamente operazioni ordinarie come l'allocazione dinamica
+della memoria, l'input/output bufferizzato sui file o la manipolazione delle
+stringhe, che sono comunemente usate da qualunque programma.
+
+Tutto ciò mette nuovamente in evidenza il fatto che nella stragrande
+maggioranza dei casi si dovrebbe usare il nome GNU/Linux in quanto una parte
+essenziale del sistema, senza la quale niente funzionerebbe, è appunto la
+\textit{GNU Standard C Library} (a cui faremo da qui in avanti riferimento
+come \acr{glibc}), ovvero la Libreria Standard del C realizzata dalla Free
+Software Foundation, nella quale sono state implementate tutte le funzioni
+essenziali definite negli standard POSIX e ANSI C (e molte altre), che vengono
+utilizzate da qualunque programma.
+
+Si tenga comunque presente che questo non è sempre vero, dato che esistono
+implementazioni alternative della Libreria Standard del C, come la
+\textit{libc5} o la \textit{uClib}, che non derivano dal progetto GNU. La
+\textit{libc5}, che era usata con le prime versioni del kernel Linux, è oggi
+ormai completamente soppiantata dalla \acr{glibc}. La \textit{uClib} invece,
+pur non essendo completa come la \acr{glibc}, resta molto diffusa nel mondo
+dei dispositivi \textit{embedded} per le sue dimensioni estremamente ridotte,
+e soprattutto per la possibilità di togliere le parti non necessarie. Pertanto
+costituisce un valido rimpiazzo della \acr{glibc} in tutti quei sistemi
+specializzati che richiedono una minima occupazione di memoria. Infine per lo
+sviluppo del sistema Android è stata realizzata da Google un'altra Libreria
+Standard del C, utilizzata principalmente per evitare l'uso della \acr{glibc}.
+
+Tradizionalmente le funzioni specifiche della Libreria Standard del C sono
+riportate nella terza sezione del \textsl{Manuale di Programmazione di Unix}
+(cioè accessibili con il comando \cmd{man 3 <nome>}) e come accennato non sono
+direttamente associate ad una \textit{system call} anche se, ad esempio per la
+gestione dei file o della allocazione dinamica della memoria, possono farne
+uso nella loro implementazione. Nonostante questa questa distinzione,
+fondamentale per capire il funzionamento del sistema, l'uso da parte dei
+programmi di una di queste funzioni resta lo stesso, sia che si tratti di una
+funzione interna della libreria che di una \textit{system call}.
+
+Come accennato in genere ogni \textit{system call} è associata ad una omonima
+funzione di libreria, che è quella che si usa normalmente per invocarla. Le
+\textsl{glibc} consentono comunque, nel caso non sia presente una specifica
+funzione di libreria corrispondente o qualora si voglia eseguire una specifica
+versione,\footnote{alcune \textit{system call} sono state modificate nel corso
+ degli anni per aggiungere ad esempio delle funzionalità, l'interfaccia
+ proposta dalle \textsl{glibc} si cura in genere di mantenere una uniformità
+ chiamando le versioni corrette, ma qualora si voglia lavorare a basso
+ livello ed usare una specifica versione, si può fare ricorso a questa
+ funzione.} di eseguire direttamente una \textit{system call} tramite la
+funzione \funcd{syscall}, il cui prototipo (accessibile se si è definita la
+macro \macro{\_GNU\_SOURCE}, vedi sez.~\ref{sec:intro_gcc_glibc_std}) è:
+
+\begin{funcproto}{
+ \fhead{unistd.h}
+ \fhead{sys/syscall.h}
+ \fdecl{int syscall(int number, ...)}
+ \fdesc{Esegue la \textit{system call} indicata da \param{number}.}
+}
+{La funzione ritorna un intero dipendente dalla \textit{system call} invocata,
+in generale $0$ indica il successo e un valore negativo un errore.}
+\end{funcproto}
+
+La funzione richiede come primo argomento il numero della \textit{system call}
+da invocare, seguita dagli argomenti da passare alla stessa, che ovviamente
+dipendono da quest'ultima, e restituisce il codice di ritorno della
+\textit{system call} invocata. In generale un valore nullo indica il successo
+ed un valore negativo è un codice di errore che poi viene memorizzato nella
+variabile \var{errno} (sulla gestione degli errori torneremo in dettaglio in
+sez.~\ref{sec:sys_errors}).
+
+Il valore di \param{number} dipende sia dalla versione di kernel che
+dall'architettura,\footnote{in genere le vecchie \textit{system call} non
+ vengono eliminate e se ne aggiungono di nuove con nuovi numeri.} ma
+ciascuna \textit{system call} viene in genere identificata da una costante
+nella forma \texttt{SYS\_*} dove al prefisso viene aggiunto il nome che spesso
+corrisponde anche alla omonima funzione di libreria; queste costanti sono
+definite nel file \texttt{sys/syscall.h}, ma si possono anche usare
+direttamente valori numerici.
+
+%
+% TODO:trattare non so se qui o altrove vsyscall e vDSO, vedi
+% http://davisdoesdownunder.blogspot.com/2011/02/linux-syscall-vsyscall-and-vdso-oh-my.html
+% http://www.win.tue.nl/~aeb/linux/lk/lk-4.html
+%