X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=intro.tex;h=56c59ffb15c39360f2397e9b710b1332760f9f23;hp=1dfaaf92f7d4da2fa3eedac8fa5b57f7c31adbf8;hb=d47f15496fa85c8ec22edcde608f2665ec5b95ae;hpb=f67bf0a685d61f70c3536e1f258b96a658162f9e diff --git a/intro.tex b/intro.tex index 1dfaaf9..56c59ff 100644 --- a/intro.tex +++ b/intro.tex @@ -1,3 +1,17 @@ +%% intro.tex +%% +%% Copyright (C) 2000-2002 Simone Piccardi. Permission is granted to +%% copy, distribute and/or modify this document under the terms of the GNU Free +%% Documentation License, Version 1.1 or any later version published by the +%% Free Software Foundation; with the Invariant Sections being "Prefazione", +%% with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the +%% license is included in the section entitled "GNU Free Documentation +%% License". +%% +\part{Programmazione di sistema} +\label{part:progr-di-sist} + + \chapter{L'architettura del sistema} \label{cha:intro_unix} @@ -52,17 +66,17 @@ all'hardware, mentre i programmi normali vengono eseguiti in modalit (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 ``\textsl{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 -ciascun processo uno spazio di indirizzi ``virtuale'' (vedi +ciascun processo uno spazio di indirizzi ``\textsl{virtuale}'' (vedi \secref{sec:proc_memory}) che il kernel stesso, con l'ausilio della unità di gestione della memoria, si incaricherà di rimappare automaticamente sulla memoria disponibile, salvando su disco quando necessario (nella cosiddetta @@ -154,7 +168,17 @@ 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 }) 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 @@ -171,17 +195,22 @@ programma. Quanto appena illustrato mette in evidenza il fatto che nella stragrande maggioranza dei casi,\footnote{esistono implementazioni diverse delle librerie - del C, come le \textit{libc5} o le \textit{uclib}, che non derivano dal - progetto GNU, ma oggi sono, tranne casi particolari, completamente - soppiantate dalle \acr{glibc}.} 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. + 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 +\textsl{Manuale di Programmazione di Unix} (cioè accessibili con il comando \cmd{man 3 }) 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 @@ -227,10 +256,10 @@ definendo gruppi di lavoro, di accesso a determinate risorse, etc. L'utente e il gruppo sono identificati da due numeri (la cui corrispondenza ad un nome espresso in caratteri è inserita nei due file \file{/etc/passwd} e \file{/etc/groups}). Questi numeri sono l'\textit{user identifier}, detto in -breve \textsl{userid}, ed indicato dall'acronimo \acr{uid}, e il \textit{group - identifier}, detto in breve \textsl{groupid}, ed identificato dall'acronimo -\acr{gid}, e sono quelli che vengono usati dal kernel per identificare -l'utente. +breve \textsl{user-ID}, ed indicato dall'acronimo \acr{uid}, e il +\textit{group identifier}, detto in breve \textsl{group-ID}, ed identificato +dall'acronimo \acr{gid}, e sono quelli che vengono usati dal kernel per +identificare l'utente. In questo modo il sistema è in grado di tenere traccia per ogni processo dell'utente a cui appartiene ed impedire ad altri utenti di interferire con @@ -283,36 +312,44 @@ qualunque sistema operativo. Per questo motivo, anche se lo standard non ha alcun riferimento ad un sistema di tipo Unix, GNU/Linux (per essere precisi le \acr{glibc}), come molti Unix moderni, provvede la compatibilità con questo standard, fornendo le funzioni -di libreria da esso previste. Queste sono dichiarate in quindici header file -(anch'essi provvisti dalla \acr{glibc}), uno per ciascuna delle quindici aree -in cui è stata suddivisa una libreria standard. In -\tabref{tab:intro_posix_header} si sono riportati questi header, insieme a -quelli definiti negli altri standard descritti nelle sezioni successive. +di libreria da esso previste. Queste sono dichiarate in una serie di +\textit{header file}\footnote{i file di dichiarazione di variabili, tipi e + funzioni, usati normalmente da un compilatore C. Per poter accedere alle + funzioni occorre includere con la direttiva \code{\#include} questi file nei + propri programmi; per ciascuna funzione che tratteremo in seguito + indicheremo anche gli \textit{header file} necessari ad usarla.} (anch'essi +provvisti dalla \acr{glibc}), In \tabref{tab:intro_posix_header} si sono +riportati i principali \textit{header file} definiti nello standard POSIX, +insieme a quelli definiti negli altri standard descritti nelle sezioni +successive. \begin{table}[htb] \footnotesize \centering - \begin{tabular}[c]{|l|l|} + \begin{tabular}[c]{|l|c|c|l|} \hline - \textbf{Standard} & \textbf{Contenuto} \\ + \multirow{2}{*}{\textbf{Header}}& + \multicolumn{2}{|c|}{\textbf{Standard}}& + \multirow{2}{*}{\textbf{Contenuto}} \\ + \cline{2-3} + & ANSI C& POSIX& \\ \hline \hline - \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.\\ + \file{assert.h}&$\bullet$&$\bullet$& Verifica le asserzioni fatte in un + programma.\\ + \file{errno.h} &$\bullet$&$\bullet$& Errori di sistema.\\ + \file{fcntl.h} &$\bullet$&$\bullet$& Controllo sulle opzioni dei file.\\ + \file{limits.h}&$\bullet$&$\bullet$& Limiti e parametri del sistema.\\ + \file{} &$\bullet$&$\bullet$& .\\ + \file{} &$\bullet$&$\bullet$& .\\ + \file{} &$\bullet$&$\bullet$& .\\ + \file{} &$\bullet$&$\bullet$& .\\ + \file{} &$\bullet$&$\bullet$& .\\ + \file{stdio.h} &$\bullet$&$\bullet$& I/O bufferizzato in standard ANSI C.\\ + \file{stdlib.h}&$\bullet$&$\bullet$& definizioni della libreria standard.\\ \hline \end{tabular} - \caption{Elenco dei vari file di include definiti dallo standard POSIX.} + \caption{Elenco dei vari header file definiti dallo standard POSIX.} \label{tab:intro_posix_header} \end{table} @@ -332,15 +369,19 @@ usare le varie estensioni al linguaggio e al preprocessore da esso supportate. 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. +processori 32 bit a 64). In particolare questo è vero nell'uso dei cosiddetti +\textit{tipi elementari}\index{tipo!elementare} del linguaggio C (come +\ctyp{int}) la cui dimensione varia a seconda dell'architettura hardware. + +Storicamente alcuni tipi nativi dello standard ANSI C sono sempre stati +associati ad alcune variabili nei sistemi Unix, dando per scontata la +dimensione. Ad esempio la posizione corrente all'interno di un file è sempre +stata associata ad un intero a 32 bit, mentre il numero di dispositivo è +sempre stato associato ad un intero a 16 bit. Storicamente questi erano +definiti rispettivamente come \ctyp{int} e \ctyp{short}, ma tutte le volte +che, con l'evolversi ed il mutare delle piattaforme hardware, alcuni di questi +tipi si sono rivelati inadeguati o sono cambiati, ci si è trovati di fronte ad +una infinita serie di problemi di portabilità. \begin{table}[htb] \footnotesize @@ -354,7 +395,7 @@ tipi si sono rivelati inadeguati, e se ne \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{ino\_t} & Numero di \textit{inode}\index{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.\\ @@ -363,8 +404,8 @@ tipi si sono rivelati inadeguati, e se ne \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{size\_t} & Dimensione di un oggetto.\\ + \type{ssize\_t} & Dimensione in numero di 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.\\ @@ -375,10 +416,11 @@ tipi si sono rivelati inadeguati, e se ne \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 +riferimento ai tipi elementari dello standard del linguaggio C, ma ad una +serie di \textsl{tipi primitivi}\index{tipo!primitivo} del sistema, riportati +in \tabref{tab:intro_primitive_types}, e definiti nell'header file +\file{sys/types.h}, in modo da mantenere completamente indipendenti i tipi +utilizzati dalle funzioni di sistema dai tipi elementari supportati dal compilatore C. @@ -407,15 +449,14 @@ identificati fra IEEE ed ISO; si tenga conto inoltre che molto spesso si usa l'estensione IEEE anche come aggiunta al nome POSIX (ad esempio si può parlare di POSIX.4 come di POSIX.1b). -Si tenga presente però che nuove specifiche e proposte di standardizzazione si -aggiungono continuamente, mentre le versioni precedenti vengono riviste; +Si tenga presente inoltre che nuove specifiche e proposte di standardizzazione +si aggiungono continuamente, mentre le versioni precedenti vengono riviste; talvolta poi i riferimenti cambiamo nome, per cui anche solo seguire le denominazioni usate diventa particolarmente faticoso; una pagina dove si possono recuperare varie (e di norma piuttosto intricate) informazioni è: \href{http://www.pasc.org/standing/sd11.html} {http://www.pasc.org/standing/sd11.html}. - \begin{table}[htb] \footnotesize \centering @@ -429,13 +470,13 @@ possono recuperare varie (e di norma piuttosto intricate) informazioni POSIX.2 & 1003.2 & 9945-2& Comandi \\ POSIX.3 & 2003 &TR13210& Metodi di test \\ POSIX.4 & 1003.1b & --- & Estensioni real-time \\ - POSIX.4a& 1003.1c & --- & Threads \\ + POSIX.4a& 1003.1c & --- & Thread \\ POSIX.4b& 1003.1d &9945-1& Ulteriori estensioni real-time \\ POSIX.5 & 1003.5 & 14519& Interfaccia per il linguaggio ADA \\ POSIX.6 & 1003.2c,1e& 9945-2& Sicurezza \\ POSIX.8 & 1003.1f& 9945-1& Accesso ai file via rete \\ - POSIX.9 & 1003.9 & --- & Intercaccia per il Fortran-77 \\ - POSIX.12& 1003.1g& 9945-1& Sockets \\ + POSIX.9 & 1003.9 & --- & Interfaccia per il Fortran-77 \\ + POSIX.12& 1003.1g& 9945-1& Socket \\ \hline \end{tabular} \caption{Elenco dei vari standard POSIX e relative denominazioni.} @@ -521,7 +562,7 @@ richiede sia X11 che Motif). La conformit del nome \textit{Unix 98}, usato spesso anche per riferirsi allo standard. -\subsection{Lo ``standard'' BSD} +\subsection{Lo ``\textsl{standard}'' BSD} \label{sec:intro_bsd} Lo sviluppo di BSD iniziò quando la fine della collaborazione fra l'Università @@ -630,7 +671,7 @@ Le macro disponibili per i vari standard sono le seguenti: standard ISO C, POSIX.1, POSIX.2, and X/Open. \item[\macro{\_XOPEN\_SOURCE}] definendo questa macro si attivano le funzionalità descritte nella \textit{X/Open Portability Guide}. Anche queste - sono un soprainsieme di quelle definite in POSIX.1 e POSIX.2 ed in effetti + sono un sovrainsieme di quelle definite in POSIX.1 e POSIX.2 ed in effetti sia \macro{\_POSIX\_SOURCE} che \macro{\_POSIX\_C\_SOURCE} vengono automaticamente definite. Sono incluse anche ulteriori funzionalità disponibili in BSD e SVID. Se il valore della macro è posto a 500 questo