Adesso che conosciamo meglio la storia di UNIX, possiamo addentrarci nel
cuore del sistema per vedere da vicino in che modo vengono realizzati
tutti gli obiettivi e i compiti che abbiamo discusso nel primo
capitolo di questo corso.
Data l’esistenza di diverse implementazioni e l’enorme
somiglianza che le caratterizza, prenderemo in esame solo una
di esse, ovvero il sistema GNU/Linux, per motivazioni che
sono ben comprensibili: è facilmente reperibile, non si paga e
abbiamo pieno accesso ai sorgenti del sistema.
Per gli esempi in seguito riportati faremo riferimento ad un’installazione
tipica di una qualsiasi delle distribuzioni Linux.
Cominciamo il nostro viaggio ricordandoci alcune nozioni già viste
nelle prime lezioni.
Il processo di avvio del sistema operativo si chiama boot
(in origine si utilizzava il termine bootstrap che alludeva
alla difficoltà del sistema di “tirarsi su” da solo)
e le istruzioni per il boot sono incorporate in un chip del computer,
detto BIOS (Basic Input/Output System).
Tra le istruzioni del BIOS ve n'è una che cerca uno speciale programma,
chiamato boot loader, che si trova in un posto predefinito
del disco fisso principale e il cui compito è far partire il sistema
operativo vero e proprio.
Per compiere questa operazione il loader cerca un kernel, lo carica
in memoria e lo fa partire.
Ci si potrebbe chiedere come mai il BIOS non carica il kernel
direttamente, invece di avviare questo processo a due stadi con
il boot loader?
Le ragioni sono principalmente due:
1) Il BIOS non è molto intelligente: fu scritto in origine per
i PC primitivi a 8 bit con dischi poco capienti e non riesce ad
accedere a una parte abbastanza grande del disco per caricare
direttamente il kernel.
2) La fase del boot loader consente anche di far partire diversi
sistemi operativi, installati in partizioni diverse del disco.
Supponendo di avere scelto come boot loader quello distribuito
con Linux, LILO (LInux LOader), all’avvio
del computer, dopo una prima serie di operazioni del BIOS, vedremo
comparire la scritta:
LILO boot:
(a meno che non si sia scelta la modalità grafica introdotta nelle
ultime versioni di LILO) alla quale, per avviare Linux, bisognerà
digitare ‘linux’ e premere il tasto [Invio].
Una volta partito, il kernel comincia a “guardarsi in giro”
alla ricerca del resto dell'hardware, e si prepara a far girare
i programmi.
In questa fase, detta autorilevamento dell’hardware,
viene fatta una scansione delle porte di I/O, che sono degli speciali
indirizzi bus nei quali il kernel sa di poter trovare i controller
dei dispositivi connessi alla macchina.
Il kernel conosce sia gli indirizzi di I/O in cui può trovare
i controller in ascolto in attesa di comandi, sia il modo in cui
essi rispondono se sono presenti.
La maggior parte dei messaggi visualizzati durante la fase di
avvio sono dovuti all'autorilevamento dell’hardware e alle
operazioni compiute dal kernel per adattarvisi.
Tutte le operazioni compiute fino al completo caricamento del
kernel costituiscono il primo livello di esecuzione della fase
di boot, chiamato run level 1 (livello di esecuzione 1).
A questo punto il kernel passa il controllo a un processo speciale,
chiamato init, che esegue diverse attività comuni.
Il primo compito del processo init è assicurarsi che i dischi
siano a posto.
I file system, infatti, sono fragili: in caso di danneggiamenti
dovuti a malfunzionamenti hardware o ad un'improvvisa mancanza
di elettricità, è necessario compiere alcune operazioni di controllo
ed intervento per ripristinare la coerenza del file system.
Il passo successivo del kernel è l’avvio dei demoni di sistema.
Un demone (o daemon) è un programma, quale uno spooler
di stampa o un server http, che rimane latente in background,
cioè senza interagire direttamente con l’utente, in attesa
di qualcosa da fare.
Questi programmi speciali devono spesso coordinare diverse richieste
che rischiano di entrare in conflitto, e per questo motivo si
è dato loro il nome di demoni, essendo quasi sempre più facile
scrivere un programma che gira costantemente e viene a conoscenza
di tutte le richieste da eseguire, piuttosto che cercare di assicurarsi
che un gruppo di copie dello stesso programma che girano tutte
contemporaneamente (ciascuna con la propria richiesta da soddisfare)
non si ostacolino a vicenda.
Il numero e il tipo di demoni che vengono avviati può variare
da una macchina all’altra, in funzione dei dispositivi hardware
posseduti e dei servizi software che l’utente vuole attivare.
Quando tutti i demoni sono avviati si passa al run level 2.
Torna all'indice Generale del corso di Corso di Sistemi Operativi di Software Planet