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.

@:\>

4 commenti:

  1. Ciao Marculin. Grazie davvero, molto gentile da parte tua. :)
    E c'è n'è ancora tanta di roba da dire, spero di poter riprendere presto. :-D

    Ciao ciao.
    @:\>

    RispondiElimina
  2. Una via di mezzo Marculin... nel senso: non è la copia di materiale altrui, e non è farina del mio sacco, chiaramente anch'io imparo da chi ne sa più di me.
    Il testo da cui sto apprendendo lo trovi nella barra di navigazione sinistra, alla voce "Risorse sul Web", link "Truelite"; il titolo del documento una volta giunto sul sito Truelite è "Amministrare GNU/Linux". Quello che hai letto è una mia personale rielaborazione - sfrondatura - adattamento per quelli che di volta in volta sono gli scopi dei vari post.
    Dagli un'occhiata, è davvero ben fatto.

    Ciao ciao.
    @:\>

    RispondiElimina
  3. Complice la richiesta di ripubblicare in un altro sito il materiale del blog, riflettevo sulla frase "Quello che hai letto è una mia personale rielaborazione - sfrondatura - adattamento per quelli che di volta in volta sono gli scopi dei vari post". Mi sono chiesto se davvero fosse così, se davvero lo sto "rielaborando - sfrondando - adattando" in altre parole, modificando...
    Lo uso per apprendere, è fonte preziosissima d'ispirazione, poi scrivo ex-novo il testo, provo personalmente i vari comandi e ne produco le relative schermate, immagini o disegni a corredo.
    E' più preciso dire: "Quello che hai letto è la mia personale comprensione-visione dell'argomento appreso dal testo.", così da liberare l'autore, Simone Piccardi a cui va un immenso ringraziamento per l'impegno profuso nell'opera, da tutte le inesattezze eventualmente da me e solo da me introdotte nei post. E se ne notate, vi prego di segnalarmele... :)

    Grazie a tutti.
    @:\>

    RispondiElimina
  4. ..non sono pratico del pc. Mi sono fatto installare direttamente, su un portatile, Ubuntu. ho cercato di installare, da semplicciotto, una connessione internet Mobile autoinstallante( chiavetta ) ma non sono approdato a nulla cioè, la chiavetta pur essendo autoinstallante come accade in Window, con ubuntu non succede nulla: non si installa. potreste darmi una mano ? ve ne sarei grato. Grazie.

    RispondiElimina

L'autore del commento si assume la totale responsabilità del suo contenuto. Commenti ritenuti offensivi o non attinenti potranno essere cancellati.