-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 {System Call Interface};
- \filldraw[fill=black!35] (0,1) rectangle (7.5,4);
- \draw (3.75,2.5) node {\huge{kernel}};
- \filldraw[fill=black!20] (0,4) rectangle (2.5,5);
- \draw (1.25,4.5) node {scheduler};
- \filldraw[fill=black!20] (2.5,4) rectangle (5,5);
- \draw (3.75,4.5) node {VM};
- \filldraw[fill=black!20] (5,4) rectangle (7.5,5);
- \draw (6.25,4.5) node {driver};
-
- \draw (1.25,7) node(cpu) [ellipse,draw] {CPU};
- \draw (3.75,7) node(mem) [ellipse,draw] {memoria};
- \draw (6.25,7) node(disk) [ellipse,draw] {disco};
-
- \draw[<->] (cpu) -- (1.25,5);
- \draw[<->] (mem) -- (3.75,5);
- \draw[<->] (disk) -- (6.25,5);
-
- \draw (7.5,0) node [anchor=base west] {kernel space};
- \draw (7.5,-1) node [anchor=west] {user space};
-
- \draw (-1,-0.5) -- (8.5, -0.5);
-
- \draw (0,-2) rectangle (7.5,-1);
- \draw (3.75, -1.5) node {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] {processo};
- \draw (3.75,-3) node(proc2) [rectangle,draw] {processo};
- \draw (6.25,-3) node(proc3) [rectangle,draw] {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 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 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}.