-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 sez.~\ref{sec:intro_standard}. Uno
-schema elementare della struttura del sistema è riportato in
-fig.~\ref{fig:intro_sys_struct}.
-
-\begin{figure}[htb]
- \centering
-% \includegraphics[width=10cm]{img/struct_sys}
- \begin{tikzpicture}
- \filldraw[fill=black!20] (0,0) rectangle (7.5,1);
- \draw (3.75,0.5) node {\textsl{System Call Interface}};
- \filldraw[fill=black!35] (0,1) rectangle (7.5,4);
- \draw (3.75,2.5) node {\huge{\textsf{kernel}}};
- \filldraw[fill=black!20] (0,4) rectangle (2.5,5);
- \draw (1.25,4.5) node {\textsf{scheduler}};
- \filldraw[fill=black!20] (2.5,4) rectangle (5,5);
- \draw (3.75,4.5) node {\textsf{VM}};
- \filldraw[fill=black!20] (5,4) rectangle (7.5,5);
- \draw (6.25,4.5) node {\textsf{driver}};
-
- \draw (1.25,7) node(cpu) [ellipse,draw] {\textsf{CPU}};
- \draw (3.75,7) node(mem) [ellipse,draw] {\textsf{memoria}};
- \draw (6.25,7) node(disk) [ellipse,draw] {\textsf{disco}};
-
- \draw[<->] (cpu) -- (1.25,5);
- \draw[<->] (mem) -- (3.75,5);
- \draw[<->] (disk) -- (6.25,5);
-
- \draw (7.5,0) node [anchor=base west] {\textit{kernel space}};
- \draw (7.5,-1) node [anchor=west] {\textit{user space}};
-
- \draw (-1,-0.5) -- (8.5, -0.5);
-
- \draw (0,-2) rectangle (7.5,-1);
- \draw (3.75, -1.5) node {\textsl{GNU C Library}};
- \draw[->] (1.25,-1) -- (1.25,0);
- \draw[->] (3.75,-1) -- (3.75,0);
- \draw[->] (6.25,-1) -- (6.25,0);
-
- \draw (1.25,-3) node(proc1) [rectangle,draw] {\textsf{processo}};
- \draw (3.75,-3) node(proc2) [rectangle,draw] {\textsf{processo}};
- \draw (6.25,-3) node(proc3) [rectangle,draw] {\textsf{processo}};
-
- \draw[->] (1.25,-2) -- (proc1);
- \draw[->] (3.75,-2) -- (proc2);
- \draw[->] (6.25,-2) -- (proc3);
- \end{tikzpicture}
- \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 fornite dal kernel viene
-rimappata in opportune funzioni con lo stesso nome definite dentro la libreria
-fondamentale del sistema, chiamata \textsl{Libreria Standard del C} (\textit{C
- Standard Library}) in ragione del fatto che il primo Unix venne scritto con
-il linguaggio C ed usando le librerie ad esso associato. Detta libreria, oltre
-alle interfacce alle \textit{system call}, contiene anche tutta la serie delle
-ulteriori funzioni di base definite nei 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 funzioni fornite dalla \textsl{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 sui file 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 dimensioni estremamente ridotte (e soprattutto per 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, un'altra versione di
- queste librerie è quella realizzata da Google per Android.} si dovrebbe
-usare il nome GNU/Linux (piuttosto che soltanto Linux) in quanto una parte
-essenziale del sistema (senza la quale niente funzionerebbe) è la \textit{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, utilizzate da
-qualunque programma.
-
-Le funzioni della libreria standard 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.
-
-Le librerie standard del C GNU consentono comunque, nel caso non sia presente
-una specifica funzione di libreria corrispondente, di eseguire una
-\textit{system call} generica 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{functions}
- \headdecl{unistd.h}
- \headdecl{sys/syscall.h}
- \funcdecl{int syscall(int number, ...)}
-
- Esegue la \textit{system call} indicata da \param{number}.
-\end{functions}
+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}