(e non possono accedere direttamente alle zone di memoria riservate o alle
porte di input/output).
-Una parte del kernel, lo \textit{scheduler}, si occupa di stabilire, ad
-intervalli fissi e sulla base di un opportuno calcolo delle priorità, quale
-``processo'' deve essere posto in esecuzione (il cosiddetto \textit{preemptive
- scheduling}\index{preemptive scheduling}). Questo verrà comunque eseguito in
-modalità protetta; quando necessario il processo potrà accedere alle risorse
-hardware soltanto attraverso delle opportune chiamate al sistema che
-restituiranno il controllo al kernel.
+Una parte del kernel, lo \textit{scheduler}\index{scheduler}, si occupa di
+stabilire, ad intervalli fissi e sulla base di un opportuno calcolo delle
+priorità, quale ``processo'' deve essere posto in esecuzione (il cosiddetto
+\textit{preemptive scheduling}\index{preemptive scheduling}). Questo verrà
+comunque eseguito in modalità protetta; quando necessario il processo potrà
+accedere alle risorse hardware soltanto attraverso delle opportune chiamate al
+sistema che restituiranno il controllo al kernel.
La memoria viene sempre gestita dal kernel attraverso il meccanismo della
\textsl{memoria virtuale}\index{memoria virtuale}, che consente di assegnare a
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}.
+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
\textbf{Standard} & \textbf{Contenuto} \\
\hline
\hline
- \texttt{stdio.h} & I/O bufferizzato in standard ANSI C.\\
- \texttt{stdlib.h} & definizioni della libreria standard.\\
- \texttt{...} & Da completare.\\
+ \file{assert.h}& Verifica le asserzioni fatte in un programma.\\
+ \file{cpio.h} & .\\
+ \file{} & .\\
+ \file{} & .\\
+ \file{} & .\\
+ \file{} & .\\
+ \file{} & .\\
+ \file{} & .\\
+ \file{} & .\\
+ \file{} & .\\
+ \file{} & .\\
+ \file{stdio.h} & I/O bufferizzato in standard ANSI C.\\
+ \file{stdlib.h}& definizioni della libreria standard.\\
\hline
\end{tabular}
\caption{Elenco dei vari file di include definiti dallo standard POSIX.}
\end{table}
-
In realtà \acr{glibc} ed i relativi header file definiscono un insieme di
funzionalità in cui sono incluse come sottoinsieme anche quelle previste dallo
standard ANSI C. È possibile ottenere una conformità stretta allo standard
usare le varie estensioni al linguaggio e al preprocessore da esso supportate.
+\subsection{I tipi di dati primitivi}
+\label{sec:intro_data_types}
+
+Uno dei problemi di portabilità del codice più comune è quello dei tipi di
+dati utilizzati nei programmi, che spesso variano da sistema a sistema, o
+anche da una architettura ad un altra (ad esempio passando da macchine con
+processori 32 bit a 64).
+
+Storicamente alcuni tipi di dati definiti dallo standard ANSI C sono sempre
+stati associati ad alcune variabili nei sistemi Unix, ad esempio la posizione
+corrente all'interno di un file è sempre stato associato ad un intero a 32
+bit, mentre il numero di dispositivo è sempre stato associato ad un intero a
+16 bit. Tutto questo ovviamente costituisce un incubo per la portabilità tutte
+le volte che, con l'evolversi delle piattaforme hardware, alcuni di questi
+tipi si sono rivelati inadeguati, e se ne è dovuto cambiare la dimensione.
+
+\begin{table}[htb]
+ \footnotesize
+ \centering
+ \begin{tabular}[c]{|l|l|}
+ \hline
+ \textbf{Tipo} & \textbf{Contenuto} \\
+ \hline
+ \hline
+ \type{caddr\_t} & core address.\\
+ \type{clock\_t} & contatore del tempo di sistema.\\
+ \type{dev\_t} & Numero di dispositivo.\\
+ \type{gid\_t} & Identificatore di un gruppo.\\
+ \type{ino\_t} & Numero di \textit{inode}.\\
+ \type{key\_t} & Chiave per il System V IPC.\\
+ \type{loff\_t} & Posizione corrente in un file.\\
+ \type{mode\_t} & Attributi di un file.\\
+ \type{nlink\_t} & Contatore dei link su un file.\\
+ \type{off\_t} & Posizione corrente in un file.\\
+ \type{pid\_t} & Identificatore di un processo.\\
+ \type{rlim\_t} & Limite sulle risorse.\\
+ \type{sigset\_t}& Insieme di segnali.\\
+ \type{ssize\_t} & Dimensione di un oggetto.\\
+ \type{ssize\_t} & Dimensione in numero byte ritornata dalle funzioni.\\
+ \type{ptrdiff\_t}& Differenza fra due puntatori.\\
+ \type{time\_t} & Numero di secondi (in tempo di calendario).\\
+ \type{uid\_t} & Identificatore di un utente.\\
+ \hline
+ \end{tabular}
+ \caption{Elenco dei tipi primitivi, definiti in \file{sys/types.h}.}
+ \label{tab:intro_primitive_types}
+\end{table}
+
+Per questo motivo tutte le funzioni di libreria di solito non fanno
+riferimento ai tipi standard del linguaggio C, ma ad una serie di \textsl{tipi
+ primitivi}, riportati in \tabref{tab:intro_primitive_types}, caratteristici
+di ogni sistema, definiti nell'header file \file{sys/types.h}, che associano i
+tipi utilizzati dalle funzioni di sistema ai tipi elementari supportati dal
+compilatore C.
+
+
+
\subsection{Lo standard IEEE -- POSIX}
\label{sec:intro_posix}