Home > GNU/Linux, newbie > Guida per principianti a GNU/Linux: ecco come è fatto il nostro sistema operativo preferito

Guida per principianti a GNU/Linux: ecco come è fatto il nostro sistema operativo preferito

Lo gnu è un bovino africano, il pinguino è un uccello polare... eppure vanno d'accordo

Lo gnu è un bovino africano, il pinguino è un uccello polare... eppure vanno d'accordo

Abbiamo visto cosa fa un sistema operativo. Abbiamo accennato anche a qualche suo componente. Ora vediamo, in concreto, come è fatto “dentro” un sistema operativo e in particolare GNU/Linux.

Abbiamo detto che il sistema operativo gestisce il nostro hardware. In particolare i dispositivi di Input/Output (tastiera, schermo, mouse, webcam, ecc.) e le memorie di massa. Per ciascuno di questi dispositivi il sistema operativo ha bisogno di un programma, chiamato driver. Driver in inglese vuol dire “pilota” e in effetti il driver “pilota” il dispositivo.

Abbiamo anche bisogno, come accennato nella puntata precedente, di qualcosa che permetta l’esecuzione di più programmi “contemporaneamente”, o meglio attraverso il multitasking. Questo componente è il kernel (nucleo). In sostanza il kernel è quella parte del sistema operativo che si occupa di gestire i processi (programmi) assegnando loro delle risorse (un po’ di tempo di esecuzione e un po’ di memoria) nonché di gestire il passaggio da un programma a un altro tantissime volte al secondo. Ma il kernel contiene anche i driver, perché deve permettere ai programmi di accedere a risorse aggiuntive (la tastiera, il mouse, lo schermo, ecc.). Per svolgere le sue funzioni il kernel mette inoltre a disposizione dei programmi delle “chiamate di sistema”.

Vediamo un po’ come funziona.

Poniamo questo caso: stiamo usando OpenOffice e a un certo punto vogliamo salvare la nostra lettera. Clickiamo sull’icona “salva”. OpenOffice a questo punto “chiama” i sistema operativo e gli dice:

Ehi, tu, crea un nuovo file e scrivici dentro i dati che adesso ti mando, poi chiudilo

Detta così sembra una battuta, ma è davvero ciò che fa il programma. In particolare farà almeno tre richieste:

  1. crea un file
  2. scrivi i dati
  3. chiudi il file

In termini tecnici queste si chiamano davvero “chiamate al sistema operativo” o, in inglese, “system calls“.

Si potrebbe pensare quindi che i programmi parlano con il kernel e chiedono queste funzioni. E invece no. I programmi, di norma, non accedono direttamente al kernel. Essi si servono invece delle librerie.

C’è una libreria particolare che si occupa di svolgere la funzione di interfaccia tra i programmi e il kernel. Nei sistemi operativi di tipo Unix, come GNU/Linux, essa è chiamata “libreria standard del C” e in particolare in GNU/Linux essa è la GNU C Library (glibc). E’ attraverso di essa che tutti i programmi dialogano con il resto del sistema operativo.

Per rendersi conto dell’importanza delle librerie in un sistema operativo, facciamo un esempio che molti conoscono: Wine.

Wine fa credere ai programmi per Windows di essere in esecuzione su un sistema Windows, mentre invece stanno girando su un sistema GNU/Linux. Come fa? Esso intercetta le chiamate dei programmi al sistema operativo (i programmi credono di girare sotto Windows) e le dirotta alle proprie librerie e poi da queste alle librerie del sistema operativo. Il tutto è talmente perfetto che Wine riesce a passare persino il test Windows Genuine Advantage!

Un esempio simile è la possibilità di eseguire programmi per GNU/Linux su un altro sistema operativo simile, ma diverso: FreeBSD. Attraverso l’aggiunta in FreeBSD della libreria C di GNU, possiamo eseguire praticamente qualsiasi programma GNU/Linux su di esso, anche se non è GNU/Linux. Ma esso possiede una delle sue parti fondamentali, ovvero la GNU C Library (oltre, chiaramente, alla libreria C di FreeBSD stesso).

A questo punto qualcuno chiederà

Ok, a quanto ho capito i programmi scritti con il linguaggio C usano la libreria C. Ma gli altri? So che esistono altri linguaggi come Java….

In realtà, tutti i programmi, a prescindere dal linguaggio in cui sono scritti, dovranno ad un certo punto interagire con il sistema operativo. E lo faranno sempre attraverso la libreria C. Questo perché GNU/Linux è scritto con tale linguaggio. Ma lo stesso vale anche per Windows, le cui librerie fondamentali sono scritte in C (o nella sua variante C++).

Vediamo di spiegare con un esempio questo concetto. Supponiamo che andiate a spedire una raccomandata alle poste. Vi recherete allo sportello e compilerete la richiesta. Tale richiesta verrà poi “lavorata” in parte davanti a voi, in parte “dietro” lo sportello. Lo stesso accade per la comunicazione tra programmi e kernel. La Libreria C si occupa di fornire certe funzioni non comprese nel kernel (come la printf che abbiamo visto), funzioni di livello più alto, ma anche di rendere facile, uniforme e rispondente allo standard di Unix (chiamato POSIX) l’accesso alle funzioni stesse del kernel, cioè le chiamate di sistema.

Un’immagine vale più di mille parole.

la comunicazione tra programma e kernel

La comunicazione tra programma e kernel

Ecco, il disegno spiega anche un’altra cosa. Il kernel di GNU/Linux è Linux. “Linux”, difatti, non è il nome dell’intero sistema operativo, ma del nucleo, il kernel appunto.

Facciamo un esperimento: proviamo a togliere Glibc. Per farlo, se usiamo Debian o Ubuntu, andiamo su Synaptic e cerchiamo “libc6”. Proviamo a disinstallarla. Come potrete notare, viene giù tutto il sistema operativo. Difatti tutti i programmi chiedono la presenza di Glibc. Ovviamente, annulliamo l’operazione.

Riassumendo, in sostanza, i programmi di norma non “vedono” né “parlano” con il kernel Linux, ma con GNU. E lo stesso facciamo noi utenti. Vediamo perché.

Abbiamo detto che il sistema operativo deve in qualche modo comunicare con l’utente. Il programma che si occupa di questo si chiama shell. In sostanza quando apriamo il terminale, oppure accediamo alla console testuale con ctrl+alt+f1, e vediamo qualcosa che alcuni erroneamente chiamano “dos” perché somiglia al vecchio MS Dos, stiamo usando la shell. La shell dei sistemi GNU/Linux è GNU Bash. Essa ci permette di lanciare i programmi, di vedere il loro output, di fornire degli input al programma (ad esempio la password che ci viene richiesta da sudo).

Infine, abbiamo detto che per poter usare il sistema operativo abbiamo anche bisogno di programmi di utilità, ad esempio per sposare o cancellare i file. Nel caso di GNU/Linux tali programmi sono le utility GNU.

Ok, bello, ma non hai spiegato cosa cavolo è questo GNU!

Eh già, devi scusarmi🙂 In estrema sintesi, GNU (che sta per “GNU is Not Unix) è il nome del sistema operativo iniziato da Richard Stallman nel 1984. Esso nasce con il preciso intento di creare un “clone” di Unix, il sistema operativo usato da università, banche, esercito, per gestire i grandi computer e su cui è nata Internet. All’epoca non esisteva nessun sistema operativo libero (o come si disse in seguito “open source”) e Stallman voleva colmare questa lacuna prendendo a modello il sistema operativo per eccellenza: Unix. Unix è stato il primo sistema operativo moderno. La nascita risale al 1970. Tutti i libri di informatica, quando cercano di definire un sistema operativo, partono sempre da ciò che c’è in Unix. E’ un sistema talmente importante che è stato standardizzato internazionalmente dall’ISO, ma il nome dello standard (POSIX) lo ha dato Stallman. Questo fa capire quanto è importante GNU nella storia dell’informatica.

Agli inizi degli anni ’90 GNU era quasi pronto. Mancava all’appello solo il kernel. Il progetto GNU ci stava lavorando (il loro kernel si chiamava Hurd) ma qualcuno arrivò prima. Questo qualcuno era Linus Torvalds, all’epoca uno studente. Linus aveva un problema: all’università usava Unix (precisamente lo Unix della SUN, che adesso si chiama Solaris), ma a casa non poteva lavorarci perché il suo computer (un allora nuovo 386) non supportava tale sistema. Pensò quindi che ne dovesse creare uno, per divertimento e per studio, e prese a modello una versione didattica di Unix chiamata Minix, scritta da un professore come supporto al suo libro di testo (ancora oggi in uso nelle università: il famoso Tanenbaum). Torvalds creò il suo mini-sistema, usando il compilatore GNU, la shell GNU e altri pezzi di GNU e scrivendo un kernel da zero per il processore Intel 386. Chiamò il sistema Linux. In quel periodo all’università di Helsinki ascoltò una conferenza sul software libero e GNU e decise che il suo sistema operativo ancora in embrione doveva essere libero. Così rilasciò Linux sotto la stessa licenza di GNU (la General Public License, GPL).

Da quel momento la storia dell’informatica ha avuto una grande accelerazione. Il kernel di Linux, la parte “nuova” che Torvalds aveva creato, venne fusa a GNU, creando un sistema operativo libero, GNU/Linux, che poteva girare sui pc più diffusi dell’epoca, i 386 e 486.

La storia non finisce qui, perché ci sono anche tanti altri pezzi in un sistema operativo GNU/Linux. Ma i pezzi fondamentali sono due: GNU e il kernel Linux. Qualsiasi distribuzione li contiene perché sono la base di tutto. Per questo, che tu stia usando Ubuntu, Debian, Slackware, Red Hat, Suse, o qualsiasi delle centinaia di distribuzioni esistenti, stai sempre usando un sistema GNU con il kernel Linux. GNU/Linux, appunto.

Nei prossimi post parleremo di alcune importanti aggiunte a questo sistema di base: Xorg e gli ambienti desktop come Gnome, kde e xfce.

Domande?

Posso usare GNU senza Linux?

Puoi usare GNU con il kernel Hurd e avrai GNU/Hurd (o semplicemente GNU). Puoi usare GNU con il kernel del sistema Solaris, e avrai GNU/Solaris. Puoi usare GNU con il kernel di FreeBSD e avrai GNU/kFreeBSD. Puoi usare GNU con il kernel di NetBSD e avrai GNU/Netbsd. Il progetto Debian distribuisce alcune versioni di questi sistemi operativi. A parte GNU/Solaris, che è già abbastanza stabile (OpenSolaris e Nexenta sono due esempi), gli altri sono ancora instabili, ma comunque funzionanti, a condizione di aver un hardware compatibile (questi kernel difatti non hanno tutti i driver di cui dispone Linux). Esiste anche GNU/Darwin, una fusione tra GNU e il kernel di Mac Os X, ma è fermo.

E Linux senza GNU?

Anche, ma avrai bisogno di qualcosa che sostituisca GNU. Di solito questo qualcosa è una libreria C ridotta e una shell semplificata con all’interno i comandi basilari. Se hai un router sicuramente esso possiede un sistema del genere.

E se volessi provare Unix?

Ormai da molto tempo non esiste più un solo Unix, ma tanti. Ad esempio Solaris è uno Unix. Non ti accorgeresti di grandi differenze rispetto a GNU/Linux. Difatti i comandi sono gli stessi e a volte anche l’interfaccia grafica è la stessa. Ad esempio Solaris usa una versione modificata di Gnome chiamata Java Desktop Enviroment. Ma la versione Open Source (OpenSolaris) usa proprio Gnome. Nexenta, di cui ho parlato prima, è in sostanza Ubuntu ma con il kernel di Solaris invece che con il Kernel Linux.

Ma come è possibile tutto ciò? Ad esempio mica posso mischiare insieme Windows con il Mac… come si fanno a mischiare sistemi operativi diversi?

Ci sono due motivi, uno tecnico l’altro legale. Il motivo tecnico è che tutti questi sistemi sono compatibili tra loro, in quanto appartengono alla famiglia di Unix. Mentre Windows è un sistema a parte, molto diverso. Quindi tecnicamente non è difficile – anzi, in molti casi proprio banale – portare un programma da un sistema all’altro, ed anche interi pezzi del sistema operativo. Il secondo motivo è legale: con il software libero puoi fare quello che vuoi. Prendi un programma e lo metti su un altro sistema operativo. Prendi la shell di GNU e la metti su Solaris, ad esempio. Non ci sono grandi limiti come nel caso delle licenze proprietarie.

Quindi mi stai dicendo che in un certo senso GNU/Linux è Unix anche se GNU vuol dire “Gnu non è Unix”?

Sì, esatto. Il nome è scherzoso: GNU non è Unix ma è comunque un sistema che rispetta lo standard POSIX. I programmi scritti seguendo le regole devinite dallo standard gireranno su tutti i sistemi operativi di tipo Unix. C’è da dire però che UNIX (scritto con le lettere maiuscole) è un marchio registrato, gestito da un consorzio chiamato Opengroup. Per diventare uno UNIX “ufficiale” bisogna pagare la certificazione. Ma questo è davvero poco importante. GNU/Linux, pur senza tale certificazione, è il sistema di tipo Unix di gran lunga più usato di tutti.

Ho sentito dire che Linux è un kernel monolitico, cosa vuol dire?

E’ un argomento un po’ complesso, ma ne parlerò prima o poi. Per ora basta sapere che un kernel monolitico è fatto da un programma unico, mentre altri tipi di kernel (detti “a microkernel”) sono costruiti “a pezzi” ognuno dei quali si occupa di un problema specifico.
E’ più semplice capire invece perché Linux è un kernel modulare: in pratica, mentre il sistema funziona, possiamo caricare dei “moduli”. I moduli sono pezzi del kernel che possono essere inseriti mentre il sistema è in esecuzione. Un modulo può essere un driver per una periferica, oppure ad esempio un pezzo che aggiunge una funzione particolare al kernel. Nonostante questo però il kernel rimane un unico programma perché questi moduli vanno ad inserirsi nel kernel mentre è in esecuzione e non sono programmi separati. Un po’ come dire che mentre guidi puoi aggiungere un cilindro al motore, ma il motore è sempre uno solo.

  1. Me
    24 luglio 2008 alle 10:48

    Bello! Bravo! Utile!
    (L’articolo, tu, l’articolo e tu)

    Grazie!

  2. 24 luglio 2008 alle 12:15

    Nice!

  3. 24 luglio 2008 alle 14:34

    ogni giorno sempre più interessante.. ti seguo ogni giorno! continua così!!!!

  4. 24 luglio 2008 alle 14:49

    Non se ne trovano di cose del genere in rete.. davvero ottima spiegazione, sono ancora un novellino di Gnu/Linux e ho capito cose che altrimenti sconoscevo totalmente!

  5. 24 luglio 2008 alle 15:49

    Mi piace il lavoro che stai facendo e anche come lo stai facendo, semplice e accessibile….perchè non parli pure di bash?
    (si lo ammetto è interesse personale)

  6. guiodic
    24 luglio 2008 alle 15:50

    Piano piano si fa tutto🙂

  7. DS
    24 luglio 2008 alle 18:15

    ottime guide e spiegazioni!

  8. °° Ivan °°
    24 luglio 2008 alle 20:31

    le tue spiegazioni sono semplici ed illuminanti🙂

  9. sara
    24 luglio 2008 alle 21:51

    “Il tutto è talmente perfetto che Wine riesce a passare persino il test Windows Genuine Advantage!”
    😯 Veramente?
    Pensare che a volte non lo passa nemmeno lo stesso Windows…

  10. guiodic
    24 luglio 2008 alle 22:01
  11. 25 luglio 2008 alle 11:26

    I tuoi articoli sono interessanti per chi come me si sta avvicinando a linux(vabbhè, a dire il vero lo uso da molti mese, ma solo ora cerco di capire come funziona… )

    Solo su un punto ho da dissentire:
    quando dici:

    Ma questo è davvero poco importante. GNU/Linux, pur senza tale certificazione, è il sistema di tipo Unix di gran lunga più usato di tutti.

    secondo me sbagli, infatti mac osx (da leopard) è certificato unix, e visto che mac osx è usato più di linux è lui il sistema unix più usato🙂

    OT: Come si fa a quotare?

    Ancora complimenti per il blog

  12. sara
    25 luglio 2008 alle 12:44

    @ Francesco: credo che guiodic tenga conto anche del web.

    @ guiodic: grazie per il link🙂

  13. guiodic
    25 luglio 2008 alle 14:19

    @Francesco: come dice Sara in effetti non ho considerato solo l’utenza desktop ma in generale (anzi non solo web, ma anche server aziendali, dove GNU/Linux è diffusissimo).
    E poi, devo dirti la verità, si fa molta fatica a considerare Mac Os X un sistema Unix vero e proprio, nonostante la certificazione. Basta pensare che non usa X Windows come server grafico a differenza di tutti gli altri Unix.

  14. 25 luglio 2008 alle 20:11

    Eccellente finalmente ho capito perchè GNU/Linux
    grazie!

  15. SimPE94
    25 luglio 2008 alle 23:11

    Ma è vero che i kernel monolitici sono criticati perché definiti obsoleti?

    Bellissima guida comunque, da incorniciare!🙂

  16. sara
    26 luglio 2008 alle 1:15

    @SimPE94: Sì, è vero. Linux è criticato perché obsoleto sin dal 1992!😀
    http://www.educ.umu.se/~bjorn/mhonarc-files/obsolete/msg00000.html

    ho notato solo ora la data palindroma: 29-1-92🙂

  17. 26 luglio 2008 alle 11:37

    @ guiodic

    Ah ok, pensavo intendessi solo i computer desktop, se intendi in generale hai ragione tu🙂

    Mac OS X ha una propria versione di X Windows: x11 ( http://it.wikipedia.org/wiki/Apple_X11 ), infatti moltissimi programmi per GNU/Linux li puoi usare su mac; ti farei vedere gedit ma mi tocca scaricare mezzo gnome per installarlo😉

  18. guiodic
    26 luglio 2008 alle 14:29

    @Francesco: lo so lo so. Ma di default mac os x non lo usa, X11 serve appunto per farci girare le applicazioni Unix.

  19. Daniele
    5 agosto 2008 alle 15:52

    Come già qualcuno ti ha suggerito, prima o poi dovresti davvero raccogliere interventi come questo e raccoglierli in un libro, magari un e-book. Complimenti davvero, continua così!🙂

    PS. Commento qui perchè finora questo è l’articolo che mi è piaciuto di più.😉

  20. anonimo
    15 settembre 2008 alle 22:22

    Hai uno stile incredibile. Complimenti vivissimi, continua così e non smettere mai.

  21. 14 gennaio 2009 alle 3:57

    Completo ed esauriente… complimenti!

  22. 16 luglio 2010 alle 15:07

  23. manuel
    3 ottobre 2010 alle 11:33

    Ciao Guido,volevo un chiarimento…in un precedente post precisamento quello in cui hai parlato delle librerie,stavi spiegando il perchè dell’istruzione include stdio.h e hai scritto: “Lo stesso fa il nostro programma: nelle librerie del sistema operativo prenderà il volume chiamato “stdio” (ovvero: standard input/output) in cui è contenuto printf”.Però in questo post hai scritto:” Lo stesso accade per la comunicazione tra programmi e kernel. La Libreria C si occupa di fornire certe funzioni non comprese nel kernel (come la printf che abbiamo visto)”…quindi la printf è inclusa in stdio o nella libreria C?Forse significa che stdio è a sua volta inclusa nella libreria C?
    Grazie….ciao

    • 3 ottobre 2010 alle 11:55

      sì esatto, stdio fa parte della libreria C.

  24. 22 agosto 2014 alle 3:22

    Magnificent goods from you, man. I have understand your
    stuff previous to and you’re just too fantastic.

    I actually like what you’ve acquired here, really like what you
    are saying and the way in which you say it. You make it entertaining
    and you still take care of to keep it wise. I can’t wait
    to read far more from you. This is really a tremendous site.

  1. 25 agosto 2008 alle 18:30
  2. 1 ottobre 2008 alle 17:07

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: