martedì 13 novembre 2007

Linux: avvio e funzionamento del kernel

All'accensione del PC, il primo programma ad essere eseguito è contenuto direttamente nel firmware della macchina: il BIOS (Basic Input/Output System). Questo programma effettua tutta una serie di controlli sull'hardware che se conclusi correttamente portano alla fase successiva: l'avvio, dal dispositivo indicato nelle impostazioni del bios, del bootloader. L'unico compito del bootloader è cercare un'immagine del kernel, caricarla in memoria e avviarla.

Partito il kernel, questi prende il controllo della macchina, effettua una serie di operazione di inizializzazione come la scansione delle periferiche disponibili, e infine lancia il primo processo di un sistema Linux, init. In realtà questa è solo una convenzione sul nome del primo processo da lanciare; in sistemi embedded ad esempio, cioè quei sistemi adibiti ad un singolo compito quali un comune telefonino, in genere viene lanciato altro.

Init, sfruttando la possibilità di un processo di lanciare a sua volta un altro processo (il primo è detto padre, il secondo figlio, Init è quindi il padre di tutti i processi Linux), lancia altri programmi che a loro volta lanciano ancora altri programmi, tutto questo fino a che sono partiti tutti i programmi che servono per il corretto funzionamento dell'intero sistema operativo.

Ma come funziona l'intero sistema operativo basandosi su un kernel che può fare solo le poche cose già viste nel post "Linux: architettura di base"? Guardate fig. 1 mentre vi spiego.

Fig. 1 - Schema architettura Linux
fig. 1


Abbiamo già accennato al fatto che il kernel è l'unico che può accedere direttamente all'hardware della macchina: grazie al
le sue tre sezioni, scheduler, virtual memory, driver sfrutta la potenza e le risorse della macchina e le rende disponibili ai processi.

Quando un programma (e quindi uno dei processi da cui è costituito) ha bisogno per esempio di altra memoria, la chiede ad un apposito programma contenuto nel sottostante livello chiamato GNU C Library (guardate fig. 1), una serie di programmi scritti in linguaggio C. Questo a sua volta, invoca un'apposita funzione del sottostante livello chiamato System Call Interface (Interfaccia alle Chiamate di Sistema). Queste sono funzioni rese disponibili dal kernel per poterlo informare che si ha bisogno di qualcosa da lui. Ora il kernel sa che un processo ha bisogno di più memoria, e tramite l'apposita sezione del Virtual Memory provvede a fornirgliela.

Si può notare una netta separazione fra lo spazio in cui si trovano a girare i programmi, detto User Space (Spazio Utente), da cui non vi accesso diretto all'hardware, e lo spazio in cui gira il kernel, detto Kernel Space, da cui invece si accede direttamente all'hardware; ecco perché solo il kernel può accedere direttamente all'hardare, mentre i processi girando in user space ne sono impossibilitati.

Il compito del kernel è unicamente quello di rendere disponibili le risorse hardware ai processi facendo da interfaccia fra questi due, di suo non effettua nessun'altra operazione. E' questo il motivo per cui in Linux tutto è realizzato tramite un programma: dalla semplice copia di un file all'intero filesystem passando per l'interfaccia grafica, si tratta sempre di programmi eseguiti in User Space, il kernel in se non ha disponibile nessuna di queste funzionalità.

Lungi dell'essere un limite, questo è invece un grande vantaggio di Linux: è per questo motivo che ad esempio, potete usare più interfacce grafiche (due su tutte, Gnome e KDE) invece dell'unica che ad esempio si può utilizzare in Windows. Ed è sempre per questo motivo che, se in Windows potete usare il solo filesystem NTFS (oppure il FAT, ormai obsoleto ma ancora utile in certe situazione), in Linux ne potete usare una buona decina tra cui anche NTFS.

Chi ha avuto modo di installare Ubuntu 7.10 direttamente sul PC, senza usare VirtualBox o altri virtualizzatori, si sarà accorto come la partizione di Windows gli compare direttamente sul desktop come fosse un normale disco rigido di Linux: potete navigarlo a vostro piacimento e fare qualunque operazione vogliate sui file che contiene nonostante si tratti di un filesystem Windows. Ecco, questa è la potenza dell'approccio "tutto è un programma" di Linux.

@:\>