Linux (kernel)

Da Wikipedia, l'enciclopedia libera.
Linux
Logo
Caricamento del Linux Kernel 2.6.24.4, Knoppix 5.3.1
Caricamento del Linux Kernel 2.6.24.4, Knoppix 5.3.1
Sviluppatore Linus Torvalds e altri
Famiglia SO POSIX
Modello del sorgente open source
Release iniziale 1.0 (13 marzo 1994[1])
Release corrente 3.15.1 (16 Giugno 2014)
Tipo di kernel Monolitico
Piattaforme supportate Alpha AXP, Sun SPARC, Motorola 68000, PowerPC, ARM, Hitachi SuperH, IBM S/390, MIPS, HP PA-RISC, Intel IA-64, AMD x86-64, AXIS CRIS, Renesas M32R, Atmel AVR32, Renesas H8/300, NEC V850, Tensilica Xtensa, Analog Devices Blackfin[2]
Licenza GNU GPLv2 only
Stadio di sviluppo In corso (sviluppo continuo)
Sito web kernel.org

Linux è un kernel distribuito con licenza GNU General Public License; è stato creato nel 1991 da Linus Torvalds. Integrato con il Sistema GNU, sviluppato da Richard Stallman, ha dato vita al sistema operativo GNU/Linux (chiamato comunemente con il solo nome Linux).

Generalità[modifica | modifica sorgente]

Il kernel è il "cuore" di un sistema operativo (nucleo) e fornisce tutte le funzioni essenziali per il sistema, in particolare la gestione della memoria primaria, delle risorse hardware del sistema e delle periferiche, assegnandole di volta in volta ai processi in esecuzione. La controparte del kernel è la shell, ovvero l'interfaccia utente del sistema, la parte più esterna. I programmi chiedono le risorse al kernel attraverso delle chiamate (system call) e non possono accedere direttamente all'hardware. Il kernel si occupa quindi di gestire il tempo processore, le comunicazioni e la memoria distribuendole ai processi in corso a seconda delle priorità (scheduling) realizzando così il multitasking.

L'architettura scelta da Torvalds per il kernel (ovvero una struttura monolitica, considerata da alcuni obsoleta a differenza della più moderna architettura a microkernel) fu causa di un dibattito molto acceso con Andrew S. Tanenbaum nel 1992 sul newsgroup comp.os.minix. Sebbene oggi il kernel possa essere compilato in modo da avere un'immagine binaria ridotta al minimo e i driver caricabili da moduli esterni, l'architettura originaria è chiaramente visibile: tutti i driver infatti devono avere una parte eseguita in kernel mode, anche quelli per cui ciò non sarebbe affatto necessario (ad esempio i driver dei file system).

Come ogni progetto che sia software libero, anche il kernel Linux è in continua evoluzione[3]. La dimensione del kernel Linux cresce in maniera esponenziale, aggiungendo nuovi moduli, nuovo hardware supportato e così via.

Linux è un kernel che supporta il multitasking ed è multi utente. Ciò permette che diversi utenti (con privilegi differenziati) possano eseguire sullo stesso sistema diversi processi software in simultanea. Attualmente Linux supporta gran parte dell'hardware disponibile per PC e supporta un numero enorme di architetture (tra cui SPARC, PowerPC, ARM e le più moderne CPU a 64 bit).

Il codice sorgente di Linux è disponibile a tutti, è ampiamente personalizzabile, al punto da rendere possibile, in fase di compilazione, l'esclusione di codice non strettamente indispensabile. La flessibilità di questo kernel lo rende adatto a tutte quelle tecnologie embedded emergenti e anche nei centri di calcolo distribuito (cluster Beowulf) fino ad essere incorporato in alcuni videoregistratori digitali e nei telefoni cellulari.

Storia[modifica | modifica sorgente]

Nell'aprile del 1991 Linus Torvalds, uno studente finlandese di informatica presso l'Università di Helsinki, all'età di 21 anni iniziò a lavorare su alcune semplici idee per un sistema operativo. Iniziò con un context switch programmato in assembly su processore Intel 80386 e un driver da terminale. A questo punto, il 25 agosto 1991, Torvalds scrisse un post[4], di cui è riportata una traduzione:

« Sto programmando un sistema operativo (gratuito e solo per hobby, non vuole essere grande e professionale come GNU) per cloni di AT 386(486). È in preparazione da aprile, e sta iniziando a funzionare. Mi piacerebbe sapere cosa vi piace e non vi piace in Minix, siccome il mio Sistema Operativo gli assomiglia in parte (fra le altre cose, lo stesso layout fisico del filesystem, per ragioni pratiche).

Ho convertito la shell bash (v.1.08) e GCC (v.1.40), e sembrano funzionare. Ciò denota che otterrò qualcosa di funzionante in pochi mesi e mi piacerebbe sapere quali funzionalità vuole la maggior parte della gente. Ogni suggerimento è ben accetto, anche se non posso promettervi che lo implementerò. »

Linus aveva iniziato a programmare il kernel su un'architettura Minix, un sistema operativo libero programmato dal professore universitario Andrew S. Tanenbaum, che poi però criticò molto il lavoro dello studente finlandese.

Dopo la pubblicazione di questo post, molte persone collaborarono allo sviluppo del progetto, e il 5 ottobre 1991 Linus rilascia la versione 0.02 del kernel, circa un mese dopo del rilascio della versione 0.01, che però non ebbe grande successo. Egli scrisse, in occasione del rilascio, il seguente post[5]:

« Rimpiangete i bei giorni di Minix 1.1, quando gli uomini erano uomini e scrivevano da soli i driver?

Vi manca un bel progetto e morite dalla voglia di spezzarvi le ossa con un Sistema Operativo che potete provare a modificare secondo le vostre necessità? Trovate frustrante che su Minix funzioni tutto? Non passate più intere notti per ottenere un programma che lavora meravigliosamente? Allora questo post dovrebbe essere fatto apposta per voi

Come ho detto un mese fa, sto lavorando su una versione libera di un clone di Minix per computer AT-386. Ha finalmente raggiunto uno stadio in cui è usabile (sebbene non possa dipendere da ciò che volete), e sono favorevole a rendere pubblici i sorgenti per la grande massa. È solo la versione 0.02 (è già pronta una patch molto piccola), ma ho avviato con successo la shell bash/GCC/GNU-make/GNU-sed/compress eccetera.

I sorgenti di questo mio progetto possono essere scaricati nic.funet.fi nella cartella /pub/Linux. La cartella contiene anche qualche file README e un paio di binari da eseguire con Linux (bash, update and gcc, cosa si può volere di più :-). È fornito il sorgente completo del kernel dato che non è stato utilizzato codice proveniente da Minix. Il sorgente delle librerie è solo parzialmente libero e non è quindi al momento distribuibile. È possibile compilare il sistema così com'è ed è stato riconosciuto funzionante. Heh. I sorgenti dei binari (bash e gcc) possono essere trovati nello stesso posto in /pub/gnu.

ATTENZIONE! NOTA! Questi sorgenti necessitano di minix-386 per essere compilati (e gcc-1.40, o, non è stato testato, 1.37.1), e impostati correttamente per il funzionamento, quindi non è ancora un sistema indipendente per chi non avesse Minix. Ci sto lavorando. Devi anche essere parecchio esperto per impostarlo correttamente, quindi per quelli che speravano in un'alternativa a minix-386, per favore ignoratemi. Al momento è indirizzata ad esperti interessati ai sistemi operativi e 386 con accesso a Minix.

Il sistema necessita di un disco rigido AT-compatibile (IDE va bene) e EGA/VGA. Se siete interessati vi prego di scaricare il README e le note di rilascio, e/o spedirmi un'email per ulteriori informazioni.

Riesco (più o meno) a sentirvi mentre vi chiedete "perché?". Hurd uscirà tra un anno (o 2, o il prossimo mese, chi lo sa), e ho già Minix. Questo è un programma per programmatori scritto da un programmatore. Mi è piaciuto scriverlo, e a qualcuno potrebbe piacere darci un'occhiata e anche modificarlo per le proprie esigenze. È abbastanza piccolo da capire, usare e modificare, e sono curioso dei vostri commenti.

Mi piacerebbe anche sentirli da chiunque abbia scritto qualsiasi utility o funzione di libreria per Minix. Se i vostri sforzi sono liberamente distribuibili (sotto copyright o anche di pubblico dominio), mi piacerebbe sentirvi, in modo che possa aggiungerli al sistema. Sto usando Earl Chews estdio al momento (grazie per un sistema carino e funzionante Earl), e lavori simili saranno molto ben accetti. Il vostro C sarà ovviamente lasciato intatto. Scrivetemi due righe se volete lasciarmi usare il vostro codice. »

Fu dato inizio ad un newsgroup alt.os.linux e il 19 gennaio 1992 fu inserito il primo post.[6] Nel 31 marzo 1992, alt.os.linux divenne comp.os.linux.[7]

Presto fu effettuato il porting di X Window System su Linux. La prima versione di Linux ad essere capace di eseguire X fu la 0.95 nel marzo del 1992. Questo grande salto di numerazione nella versione (da 0.1x a 0.9x) fu dovuto al fatto che si sentiva molto vicina una versione 1.0 senza nessun pezzo mancante. Tuttavia questa sensazione era troppo ottimista e dal 1993 fino agli inizi del 1994 furono rilasciate 15 versioni della versione 0.99.

Il 14 marzo 1994 fu rilasciato Linux 1.0.0, con 176.250 linee di codice. A marzo del 1995, fu rilasciato Linux 1.2.0 (310 950 linee di codice).

La versione 2 di Linux, rilasciata il 9 giugno 1996, fu seguita da altre versioni maggiori sotto il prefisso della versione 2:

  • 25 gennaio 1999 - Rilascio di Linux 2.2.0 (1 800 847 linee di codice).
  • 18 dicembre 1999 - Furono pubblicate le patch per mainframe IBM 2.2.13, che permisero a Linux di essere installato su macchine di livello enterprise.
  • 4 gennaio 2001 - Rilascio di Linux 2.4.0 (3 377 902 linee di codice).
  • 17 dicembre 2003 - Rilascio di Linux 2.6.0 (5 929 913 linee di codice).
  • 9 ottobre 2008 - Rilascio di Linux 2.6.27 (9 709 868 linee di codice)[8].
  • 24 dicembre 2008 - Rilascio di Linux 2.6.28 (10 195 402 linee di codice).
  • 20 ottobre 2010 - Rilascio di Linux 2.6.36 (13 499 457 linee di codice).[9]
    Nel luglio del 2011, per festeggiare il 20º anniversario della nascita di Linux, Torvalds ha deciso di passare ad un sistema di numerazione a 2 cifre, rilasciando la versione 3.0 del kernel. L'ultima release della serie 2.6 è stata la 2.6.39.

La prima release del nuovo sistema di numerazione adottato - la 3.0 - pubblicata contiene 14 646 952 righe di codice.

Aspetti legali[modifica | modifica sorgente]

Termini di licenza[modifica | modifica sorgente]

Inizialmente, Torvalds rilasciò Linux con una licenza che ne proibiva lo sfruttamento commerciale. Essa però lasciò presto il posto alla GNU General Public License (GPL) dalla versione 0.12. Questa licenza permette la distribuzione e la vendita di versioni modificate o non modificate di Linux a condizione che vengano rilasciate con la stessa licenza e che si fornisca anche il corrispondente codice sorgente.

Torvalds ha descritto l'adozione della licenza GPL come "la miglior cosa che abbia mai fatto."[10]

GPL versione 3[modifica | modifica sorgente]

Exquisite-kfind.png Per approfondire, vedi GNU General Public License#La Versione 3.

Attualmente, Linux adotta soltanto la versione 2 della licenza GPL, senza nessuna opzione (a differenza di molti programmi rilasciati con licenza GPL) che permette l'uso di una versione più avanzata, e ci sono alcune controversie sulla facilità con cui si potrebbero usare versioni successive come la 3 (e su quanto sia desiderabile).[11] Torvalds stesso ha specificato durante il rilascio della versione 2.4.0 che il suo codice adotta soltanto la versione 2 della licenza.[12] Tuttavia, i termini della licenza GPL affermano che, se non viene specificata nessuna versione, allora ne può essere usata una qualsiasi, e Alan Cox fece notare che solo pochi di chi contribuisce a Linux hanno specificato una particolare versione della licenza GPL.[13] Un blogger ha concluso che circa il 40% del codice di Linux è specificatamente rilasciato con licenza "GPL2 o superiore", e un altro 10% circa con licenza "GPL" (con versione non specificata), il che, messo assieme, costituisce circa la metà del kernel. Nel settembre 2006, un'indagine su 29 sviluppatori-chiave del kernel ha indicato che 28 di questi preferivano GPLv2 alla GPLv3 allora in stato di bozza. Torvalds ha commentato, «Penso che un nutrito numero di persone esterne credevano che fossi io l'unico strano, per il fatto che ho dichiarato pubblicamente di non essere un grande fan della GPLv3».[14]

Moduli Kernel Caricabili e firmware[modifica | modifica sorgente]

Non è chiaro se i moduli kernel caricabili (LKM) debbano essere considerati opera derivata per la legge sul copyright, e quindi ricadano entro i termini della licenza GPL. Torvalds ha affermato che i LKM, usando soltanto un sottoinsieme limitato di interfacce "pubbliche" del kernel, possono a volte non essere considerati opere derivate, ed è quindi possibile avere alcuni driver esclusivamente binari e altri LKM che non adottano la licenza GPL. Non tutti coloro che contribuiscono allo sviluppo di Linux però sono d'accordo con questa interpretazione, e anche lo stesso Torvalds ammette che molti LKM sono chiaramente opere derivate, ed infatti ha scritto che "I moduli kernel SONO opere derivate 'per default'". D'altra parte Torvalds ha anche detto che "Un'area grigia è qualcosa come un driver originariamente scritto per un altro sistema operativo (cioè chiaramente non un'opera derivata da Linux in origine). [...] QUELLA è un'area grigia, e _quella_ è l'area dove personalmente penso che alcuni moduli potrebbero non essere considerati opere derivate semplicemente perché non sono stati progettati per Linux e non dipendono da nessun comportamento speciale di Linux."[15] I driver grafici proprietari in particolare, sono al centro di un dibattito. In definitiva, è probabile che queste questioni possano essere risolte soltanto da un tribunale.

Un punto di controversia sulla licenza è l'uso in Linux di firmware "binario" per supportare alcuni dispositivi hardware. Richard Stallman afferma che questi software fanno di Linux un software parzialmente non aperto, e che distribuire Linux potrebbe anche violare la licenza GPL (che richiede la presenza di tutto il codice sorgente).[16]

In risposta a ciò, la Free Software Foundation Latin America (FSFLA) ha avviato un progetto, denominato Linux-libre, per creare un kernel completamente libero, senza moduli proprietari, per poter essere usato in distribuzioni completamente libere, come Trisquel[17][18].

Marchio registrato[modifica | modifica sorgente]

Linux è un marchio registrato di Linus Torvalds negli Stati Uniti e in altri Paesi. Questo è il risultato di un incidente in cui William Della Croce Jr., che non partecipava allo sviluppo del progetto Linux, registrò il nome e successivamente richiese una Royalty per il suo uso. Diversi sostenitori di Linux chiesero consiglio legale e intentarono causa contro Della Croce, che acconsentì nel 1998 ad assegnare il marchio a Torvalds.

Contenzioso SCO[modifica | modifica sorgente]

A marzo del 2003, il gruppo SCO intentò causa contro IBM accusandola di aver violato il copyright sul codice sorgente Unix, inserendo porzioni di quel codice in Linux. Inoltre, SCO mandò lettere a diverse compagnie avvisandole che l'uso di Linux senza una licenza di SCO poteva essere una violazione della legge sul copyright, e dichiarò alla stampa che avrebbero intentato causa agli utenti Linux individuali. IBM allora promise di difendere i suoi clienti Linux. Questo contenzioso generò una serie di cause intentate da SCO nei confronti di Novell, DaimlerChrysler (parzialmente ritirata nel luglio 2004), AutoZone, e cause di ritorsione intentate da Red Hat e altri contro SCO.

All'inizio del 2007 SCO fornì i dettagli specifici della presunta violazione di copyright. Diversamente dalle precedenti affermazioni che vedevano SCO proprietaria di 1 milione di righe di codice, specificarono soltanto 326 linee di codice, la maggior parte del quale non era coperto da copyright.[19] Ad agosto 2007, la corte nel caso Novell stabilì, per cominciare, che SCO non possedeva neanche i diritti di copyright su Unix.[20]

Caratteristiche tecniche[modifica | modifica sorgente]

System Call Interface e Linux Standard Base

Linux supporta il multitasking con pre-rilascio (sia in user mode che in kernel mode), memoria virtuale, librerie condivise, caricamento a richiesta, eseguibili copy-on-write condivisi, gestione della memoria, la suite di protocolli Internet, e il threading.

Architettura[modifica | modifica sorgente]

Mappa del kernel di Linux e la sua versione interattiva.

Linux è un kernel monolitico. I driver e le estensioni del kernel lavorano nel kernel space (ring 0 nella maggior parte delle CPU), con pieno accesso all'hardware, sebbene alcune eccezioni lavorino in user space. Il sistema grafico che la maggior parte delle persone utilizza con Linux non lavora nel kernel space, al contrario di quello che accade in Microsoft Windows[non chiaro].

Kernel mode Preallocazione consente ai driver dei dispositivi di essere preallocati sotto determinate condizioni. Questa caratteristica è stata introdotta per gestire correttamente gli interrupt dell'hardware e migliorare il supporto al multiprocessing simmetrico (SMP). La preallocazione inoltre migliora la latenza, incrementano la reattività e rendono Linux più adatto ad applicazioni in tempo reale.

Opzioni di Compilazione[modifica | modifica sorgente]

Il kernel Linux ha delle opzioni di compilazione configurabili che consentono di aggiungere o rimuovere specifiche caratteristiche dal kernel durante la compilazione iniziale. Durante quest'ultima fase possono inoltre essere configurati alcuni parametri di default personalizzati.

Kernel panic[modifica | modifica sorgente]

Kernel Panic
Exquisite-kfind.png Per approfondire, vedi Kernel panic.

In Linux, un "panic" è un errore di sistema irrecuperabile individuato dal kernel al contrario di errori simili individuati in modalità user space. Il codice in kernel mode ha la possibilità di indicare una condizione di questo tipo chiamando la funzione panic dichiarata nell'header del file sys/system.h. Comunque la maggior parte dei kernel panic sono il risultato di eccezioni nel codice del kernel, come per esempio riferimenti a indirizzi di memoria non validi. Questo è tipicamente indice di

  • un bug da qualche parte nella call chain che conduce al kernel panic;
  • un danno a livello hardware, come una cella di RAM danneggiata o errori nelle funzioni aritmetiche nel processore provocati da un bug del processore, un processore surriscaldato, danneggiato;
  • un errore a livello software;
  • un errore nei parametri forniti dal bootloader, ad esempio l'immagine initrd.

Il dibattito Tanenbaum-Torvalds[modifica | modifica sorgente]

Il fatto che Linux sia un kernel monolitico piuttosto che un microkernel è stato l'argomento del dibattito Tanenbaum-Torvalds tra Andrew S. Tanenbaum e Linus Torvalds. Il dibattito iniziò nel 1992 riguardo Linux e l'architettura del kernel in generale sul gruppo di discussione Usenet comp.os.minix.[21]

Tanenbaum sosteneva che i microkernel fossero superiori ai kernel monolitici e che perciò Linux fosse obsoleto. A differenza dei kernel monolitici tradizionali, i driver sono facilmente configurati come moduli del kernel e caricati o meno mentre il sistema è in esecuzione. Questo argomento è stato riproposto il 9 maggio 2006[22] e il 12 maggio 2006.[23]

Linguaggi di programmazione[modifica | modifica sorgente]

Linux è scritto nella versione del linguaggio di programmazione C supportata dal compilatore GCC (che ha introdotto numerose estensioni e cambiamenti al C standard), insieme a un certo numero di brevi sezioni di codice scritte in linguaggio assembly (sintassi GCC con stile "AT&T"). Grazie alle estensioni di C che supporta, GCC per lungo tempo è stato il solo compilatore in grado di compilare correttamente Linux. Nel 2004, Intel asserì di aver modificato il kernel in modo tale che anche il suo compilatore C fosse in grado di compilare Linux.[24]

In qualche modo vengono utilizzati molti altri linguaggi, soprattutto nel processo di compilazione del kernel (metodi in cui a partire dal codice sorgente viene creata un'immagine avviabile). Questi includono Perl, Python e diversi linguaggi di shell scripting. Alcuni driver possono anche essere scritti in C++, Fortran o altri linguaggi, ma questa pratica è fortemente scoraggiata. Il sistema di compilazione di Linux supporta ufficialmente solo GCC come compilatore sia del kernel sia dei driver.

Portabilità[modifica | modifica sorgente]

iPodLinux mentre effettua il boot del Kernel.

Sebbene inizialmente non progettato per essere portabile, Linux è uno dei kernel di sistema operativo maggiormente portabile, in grado di funzionare su un'ampia gamma di sistemi dall'iPAQ (un computer palmare) all'IBM System z9 (un server mainframe in grado di eseguire centinaia o migliaia di istanze Linux contemporanee). Linux è il sistema operativo principale dei supercomputer Blue Gene di IBM. Linux è il sistema operativo di più dell'85% dei sistemi nella classifica Top 500 dei supercomputer.[25] Inoltre, Linux è stato compilato in numerosi dispositivi portatili come TuxPhone e l'iPod di Apple.

Architetture delle macchine virtuali[modifica | modifica sorgente]

Il kernel Linux ha un supporto estensivo e funziona su numerose architetture di macchine virtuali sia come sistema operativo "server" che "client". Le macchine virtuali solitamente emulano la famiglia di processori Intel x86, sebbene in alcuni casi siano emulati anche i processori PowerPC o AMD.

Formati binari supportati[modifica | modifica sorgente]

Linux 1.0 supportava il formato binario a.out e l'ELF, che semplifica la creazione di librerie condivise (usate tantissimo dai moderni desktop environment come KDE e GNOME[26]). ELF è il formato standard usato da GCC fin dalla versione 2.7.0[27] perciò oggigiorno a.out viene usato molto raramente.

Linux supporta molti altri formati binari, inclusi binfmt misc per associare un file a un programma (come un interprete) per eseguire o mostrare quel file.

File system[modifica | modifica sorgente]

Il file system utilizzato dai sistemi Linux fa riferimento al Filesystem Hierarchy Standard, uno standard per file system per sistemi Unix e Unix-like di tipo ad albero gerarchizzato.

Costo stimato per lo sviluppo[modifica | modifica sorgente]

Il costo per sviluppare nuovamente la versione 2.6.0 del kernel Linux in un'ottica proprietaria è stato stimato nel 2004 pari a 612 milioni di dollari (467 milioni di euro) usando il modello di stima uomo-mese COCOMO.[28] Nel 2006, uno studio finanziato dall'Unione Europea ha stimato che, sviluppare da zero (in un'ottica proprietaria) il kernel 2.6.8 o superiore, costerebbe 882 milioni di euro.[29]

Versioni[modifica | modifica sorgente]

Mentre sviluppa il proprio codice e integra le modifiche create da altri programmatori, Linus Torvalds continua a rilasciare nuove versioni del kernel di Linux. Queste sono chiamate versioni "vanilla", ad indicare che non sono state modificate da nessun altro. Molte distribuzioni Linux modificano il kernel per il proprio sistema, principalmente allo scopo di aggiungere il supporto per driver o caratteristiche che non sono state ufficialmente rilasciate come stabili, mentre altre distribuzioni usano un kernel vanilla.

Numerazione delle versioni[modifica | modifica sorgente]

Per lungo tempo la versione del kernel di Linux era composta da tre numeri, ma recentemente questo sistema è stato modificato e ora la versione consiste di quattro cifre, nella forma "A.B.C[.D]", per esempio 2.2.1, 2.4.13, oppure 2.6.12.3;

  • la 'A' indica la versione del kernel, che viene modificata molto raramente e solo quando avvengono mutamenti radicali del codice (fino al 2008 questo è avvenuto solo due volte, nel 1994, con l'introduzione della versione 1.0, e nel 1996 con la versione 2.0) o per ragioni commemorative (versione 3, nel 2011, per i 20 anni del kernel linux);
  • la 'B' indica la revisione "maggiore" del kernel:
    • prima della serie 2.6.x, i numeri pari (come 1.2, 2.4, oppure 2.6) indicavano un ramo stabile e i numeri dispari (come 1.1 oppure 2.5) indicavano rami di sviluppo, dove erano sperimentate nuove caratteristiche e driver finché queste non erano reputate adatte ad essere incluse nel ramo stabile;
    • a partire dalla serie 2.6.x, la differenziazione tra numeri pari e dispari perde di significato, in quanto lo sviluppo di nuove caratteristiche avviene all'interno dello stesso ramo, allo scopo di ottenere uno sviluppo più lineare;
  • la 'C' indica la revisione "minore" del kernel: nel vecchio schema di numerazione, questo numero aumentava quando venivano implementati nel kernel aggiornamenti riguardanti la sicurezza, correzioni di alcuni errori, nuove caratteristiche, o nuovi driver; secondo il modello attuale questo numero viene cambiato solo quando nuovi driver o caratteristiche diverse sono introdotte, in quanto le correzioni minori sono conteggiate dal numero contrassegnato con 'D';
  • l'uso della 'D' è iniziato quando un grave problema, che richiedeva una correzione immediata, è stato riscontrato nel codice NFS del 2.6.8. Non esisteva l'esigenza di cambiamenti tali da giustificare il rilascio di una revisione minore (che sarebbe diventata la versione 2.6.9), così, il 2.6.8.1 venne rilasciato, con la sola correzione di questo errore. Dal 2.6.11, questo modello venne adottato come nuovo paradigma ufficiale. Correzioni e patch di sicurezza adesso sono conteggiate così, con la quarta cifra, mentre se ci sono cambiamenti più consistenti, si usa la terza cifra. La cifra 'D' è inoltre associata col numero delle volte che il compilatore ha costruito il kernel, ed è denominata "build number".

Inoltre, alle volte si possono trovare altre lettere dopo la versione, come 'rc1' o 'mm2'; 'rc' è una versione candidata ad essere adottata come stabile, e indica una release non ufficiale. Altre lettere, invece, sono spesso (ma non sempre) le iniziali di una persona: questo segnala un fork del kernel da parte di questa persona. Per esempio, la dicitura 'ck' sta per Con Kolivas, 'ac' per Alan Cox, mentre 'mm' indica Andrew Morton. Certe volte, le lettere sono collegate alla caratteristica principale del kernel. Per esempio, 'wl' indica una versione di test per le reti wireless.

Modello di sviluppo[modifica | modifica sorgente]

Il modello di sviluppo per Linux 2.6 differisce molto da quello di Linux 2.5. Precedentemente esisteva un ramo stabile (2.4), dove solo i cambiamenti relativamente piccoli e quelli ritenuti sicuri venivano attuati, e un ramo instabile (2.5), dove invece cambiamenti più consistenti erano permessi. Questo significava che gli utenti avevano sempre una versione con le correzioni più recenti, ma dovevano aspettare per le nuove aggiunte provenienti dal ramo 2.5. L'aspetto negativo di questo procedimento, era dato dal fatto che la versione stabile del kernel, col passare del tempo, non supportava più l'hardware recente, e mancava delle caratteristiche che a mano a mano risultavano necessarie. Verso la fine della serie 2.5.x, alcuni sviluppatori hanno deciso di apportare alcune modifiche nel ramo stabile, ma questo ha provocato un aumento dei problemi nella serie 2.4.x del kernel. Il ramo 2.5 venne allora dichiarato stabile e rinominato 2.6. Invece di aprire un ramo 2.7 instabile, gli sviluppatori continuarono a inserire modifiche d'una certa importanza nel ramo stabile. In questa maniera si sono tenuti sotto controllo con maggior precisione i cambiamenti, dividendoli in parti più piccole, rendendo disponibili le nuove caratteristiche velocemente, e ampliando il numero di persone che testano il codice più recente.

Il nuovo modello di sviluppo che caratterizza il 2.6, fa sì inoltre che non esista un ramo stabile per le persone che cercano solo correzioni di bug o inerenti alla sicurezza, ma non necessitano delle ultime caratteristiche. Le correzioni vengono applicate solo nella versione più recente, così se un utente vuole una versione con tutti i bug noti corretti, ottiene nel contempo tutte le ultime caratteristiche, ma rischia (in alcuni casi) di non far funzionare più alcune cose che nella versione precedente funzionavano. Una correzione parziale di questo problema è stata prima menzionata (vedasi la quarta cifra del numero della versione): essa caratterizza i nuovi kernel, ma non risolve completamente alcune necessità che non si avrebbero usando un ramo stabile. Le distribuzioni, come Red Hat e Debian, allegano già un certo tipo di kernel nei loro rilasci: alla maggior parte delle persone conviene usare le versioni predefinite.

In risposta alla mancanza di un ramo stabile del kernel (inteso come ramo dove non vengono apportati nuovi cambiamenti, ma solo correzioni), Adrian Bunk, nel dicembre 2005, ha annunciato che avrebbe continuato a rilasciare kernel 2.6.16.y anche quando fosse stata rilasciata la versione 2.6.17.[30] Inoltre ha progettato di includere aggiornamenti relativi ai driver, rendendo così lo sviluppo della serie 2.6.16 molto simile a quello della vecchia 2.4.[31]

Il 10 ottobre 2008, è stata rilasciata la versione stabile 2.6.27.[32]. Nel febbraio dello stesso anno, gli sviluppatori hanno poi ideato un ramo del kernel instabile, denominato linux-next: un posto dove ospitare le modifiche, con l'intento di includerle nel ciclo di sviluppo successivo.[33]

Nel luglio del 2011, per festeggiare il 20º anniversario della nascita di Linux, Torvalds ha deciso di rilasciare la versione 3.0 del kernel, passando ad un sistema di numerazione a 2 cifre. L'ultima release della serie 2.6 è stata la 2.6.39.

Versioni storiche[modifica | modifica sorgente]

La prima versione del kernel è stata la 0.01. Questa venne seguita dalla 0.02, 0.03, 0.10, 0.11, 0.12 (la prima versione rilasciata sotto licenza GNU General Public License), 0.95, 0.96, 0.97, 0.98, 0.99, e dalla 1.0.[34] Dalla versione 0.95 a queste, sono state rilasciate numerose patch tra le versioni.

Manutenzione[modifica | modifica sorgente]

Linus Torvalds è il supervisore dei cambiamenti e del rilascio delle ultime versioni del kernel: ha delegato la manutenzione delle versioni più datate ad altri programmatori. Alcune versioni vecchie come la 2.0 (ufficialmente resa obsoleta dal kernel 2.2.0 rilasciato nel gennaio 1999) sono aggiornate solo quando questo viene reputato necessario e i cambiamenti sono molto rari.

Serie del kernel Versione corrente Supervisore
2.0 2.0.40 David Weinehall[35]
2.2 2.2.27-rc2 Marc-Christian Petersen[36] (ex supervisore Alan Cox)
2.4 2.4.37-rc2 Willy Tarreau[37] (ex supervisore Marcelo Tosatti)
2.6.16 2.6.16.62 Adrian Bunk[38]
2.6.17+ (cambiamenti frequenti) Linus Torvalds
2.6.x-mm (cambia rapidamente) Andrew Morton

Altri programmatori del kernel di Linux particolarmente conosciuti sono Robert Love e Ingo Molnár.[39]

Controllo versione[modifica | modifica sorgente]

In passato il codice sorgente del kernel Linux era gestito senza l'impiego di un sistema automatico di controllo versione (in inglese source code management, SCM), principalmente a causa del fatto che a Torvalds non piacciono gli SCM centralizzati.

Nel 2002 lo sviluppo del kernel passò a BitKeeper, un SCM che soddisfaceva i requisiti tecnici richieste da Torvalds e che era interoperabile, a certi livelli, con altri sistemi come CVS e Subversion. Sebbene Torvalds e altri sviluppatori ottenessero BitKeeper gratuitamente, il fatto che non fosse software libero causò delle controversie.

Dei tentativi di reverse-engineering di Andrew Tridgell su BitKeeper convinsero BitMover, la compagnia che gestiva BitKeeper, a terminare il suo sostegno alla comunità di sviluppo di Linux. Di conseguenza, Torvalds e altri scrissero un nuovo sistema di controllo di versione, chiamato git; il nuovo software fu scritto in poche settimane, e due mesi dopo si ebbe la prima versione ufficiale del kernel Linux rilasciata con git.[40] Poco dopo git è diventato un progetto indipendente, guadagnandosi un'ampia diffusione nella comunità del software libero.

Cronologia della versione stabile[modifica | modifica sorgente]

Ci sono state due versioni maggiori stabili del kernel Linux 1.x: la 1.0 e la 1.2. La versione 1.0 fu rilasciata il 14 marzo 1994[41] Questa versione del kernel Linux era compatibile esclusivamente coi sistemi a singolo processore i386. In seguito ci si iniziò a preoccupare anche della portabilità, e così la versione 1.2 (rilasciata il 7 marzo 1995[42]) incorporò il supporto per i sistemi basati su architetture DEC Alpha, SPARC, e MIPS. Questa fu l'ultima versione stabile rilasciata nella serie 1.x del kernel Linux.

La versione 2.x del kernel Linux ha visto un gran numero di cambiamenti, in particolare nella serie 2.6 e sul come viene sviluppata, mantenuta e rilasciata. Le versioni 2.0, 2.2, e 2.4 furono costruite usando il vecchio sistema di sviluppo dove ognuno dei kernel era basato sulla versione stabile di quello precedente. La versione 2.0 fu rilasciata il 9 giugno 1996[43]. Ci furono 41 rilasci in questa serie. La principale caratteristica del kernel 2.0 era il supporto al SMP (cioè al supporto a più processori su un singolo sistema) e il supporto per più tipi di processori.

La versione 2.2 (rilasciata il 26 gennaio 1999[44]) rimosse lo spinlock globale, fornì un migliore supporto al multiprocessing simmetrico e aggiunse il supporto per le architetture m68k e PowerPC oltre all'aggiunta di nuovi filesystem (incluso il supporto in sola lettura per il filesystem della Microsoft NTFS).[45] Lo sviluppo della serie 2.4.x cambiò un po'. In questa serie infatti furono rese disponibili nuove caratteristiche durante tutto lo sviluppo della serie stessa. La versione 2.4.0, rilasciata il 4 gennaio 2001,[46] conteneva il supporto per ISA Plug and Play, USB, e PC Card.[47] Includeva inoltre il supporto per i processori PA-RISC della Hewlett-Packard. Durante lo sviluppo della serie 2.4.x furono aggiunte altre caratteristiche includendo: supporto Bluetooth, Logical Volume Manager (LVM) versione 1, supporto RAID, InterMezzo FS e ext3 FS.

Con l'arrivo della serie 2.6.x del kernel Linux, il sistema di numerazione cambiò in modo che ci potessero essere 4 cifre nel numero di versione del kernel, dandogli il formato 2.6.x.y (dove.y è opzionale). Le nuove caratteristiche vengono ora aggiunte tra una release x e l'altra, mentre le release y sono solitamente riservate alla correzioni di bug. La versione 2.6.0 fu rilasciata il 18 dicembre 2003.[48] La serie 2.6 del kernel è tuttora (27 ottobre 2008) la serie stabile attiva. Tra i cambiamenti fatti in questa serie ci sono: l'integrazione di µClinux nei sorgenti del kernel principali, il supporto alla PAE, il supporto a diverse nuove linee di CPU, l'integrazione di ALSA nei sorgenti principali del kernel, il supporto a un numero di utenti fino a 232 (216 nelle versioni precedenti), il supporto a un numero di processi fino a 230 (215 nelle precedenti versioni), una crescita sostanziale del numero di tipi di dispositivo e del numero di dispositivi per ogni tipo, supporto ai processori a 64 bit migliorato, supporto di file system fino a 16 terabytes, in-kernel preemption, supporto alla libreria Native POSIX Thread Library, integrazione nei sorgenti principali del kernel di UML e di SELinux, supporto a Infiniband, e molto altro. Altrettanto importante è l'aggiunta di diversi filesystem durante le varie release della serie 2.6.x: FUSE, JFS, XFS, ext4 e altri[49].

Oggetti Kernel[modifica | modifica sorgente]

Gli oggetti kernel (kernel items) sono funzioni, variabili, file header e macro.[50]

Header kernel[modifica | modifica sorgente]

Gli header del kernel sono file header C che forniscono la condivisione di alcune definizioni del kernel di basso livello ABI tra kernel e applicazioni dello spazio utente. La maggior parte delle applicazioni non necessita di questi header: essi servono soltanto per l'uso diretto da parte delle librerie di sistema, utilità e daemon di basso livello.[51]

Il comando "make headers_install", quando eseguito sull'albero dei sorgenti del kernel, esporta i file header del kernel in una forma adatta all'uso dei programmi nello spazio utente.[52] Quando esportati, la maggior parte degli header del kernel si trovano nelle cartelle /usr/include/asm e /usr/include/linux

Note[modifica | modifica sorgente]

  1. ^ (EN) Linux: The 0.01 Release. URL consultato il 9 gennaio 2011.
  2. ^ (EN) Piattaforme supportate dal kernel Linux. URL consultato il 23 luglio 2010.
  3. ^ Le nuove release sono reperibili sul sito kernel.org
  4. ^ (EN) Linus Torvalds, What would you like to see most in minix? in comp.os.minix, 26 agosto 1991. URL consultato il 25 dicembre 2008.
  5. ^ (EN) Linus Torvalds, Free minix-like kernel sources for 386-AT in comp.os.minix, 5 ottobre 1991. URL consultato il 25 dicembre 2008.
  6. ^ (EN) David W Summers, Troubles with Partitions in alt.os.linux / comp.os.minix, 19 gennaio 1992. URL consultato il 24 dicembre 2008 (archiviato il 24 dicembre 2008).
  7. ^ (EN) Alan B Clegg, It's here! in comp.os.linux, 31 marzo 1992. URL consultato il 24 dicembre 2008 (archiviato il 24 dicembre 2008).
  8. ^ "Linux Kernel Data."
  9. ^ "Linux Kernel Data."
  10. ^ Hiroo Yamagata, The Pragmatist of Free Software, HotWired, 1997. URL consultato il 21 febbraio 2007.
  11. ^ Jonathan Corbet, GPLv3 and the kernel, LWN.net, 31 gennaio 2006. URL consultato il 21 febbraio 2007.
  12. ^ Linus Torvalds, Linux-2.4.0-test8 in Linux-kernel mailing list archive, Unix Systems Support Group of Indiana University, 8 settembre 2000. URL consultato il 21 febbraio 2007.
  13. ^ Alan Cox, Re: GPL V3 and Linux in Linux-kernel mailing list archive, LWN.net, 20 gennaio 2006. URL consultato il 21 febbraio 2007.
  14. ^ Stephen Shankland, Top Linux programmers pan GPL 3, News.com, 25 settembre 2006. URL consultato il 21 febbraio 2007.
  15. ^ Re: Linux GPL and binary module exception clause?
  16. ^ Richard Stallman, Linux, GNU, and freedom, Free Software Foundation, 11 ottobre 2006. URL consultato il 21 febbraio 2007.
  17. ^ (EN) Progetto Linux-libre, http://www.fsfla.org. URL consultato il 6 aprile 2010.
  18. ^ (EN) Trisquel GNU/Linux-libre, trisquel.info. URL consultato il 6 aprile 2010.
  19. ^ Report from the Courthouse 7 March. Groklaw article
  20. ^ Court Rules: Novell owns the UNIX and UnixWare copyrights. Groklaw article
  21. ^ (EN) Andrew Stuart Tanenbaum, LINUX is obsolete in comp.os.minix, 29 gennaio 1992. URL consultato il 25 dicembre 2008 (archiviato dall'url originale il 25 dicembre 2008).
  22. ^ Linus Torvalds, Hybrid kernel, not NT, 9 maggio 2006. URL consultato il 6 gennaio 2007.
  23. ^ Andy Tanenbaum, Tanenbaum-Torvalds Debate: Part II, 12 maggio 2006. URL consultato il 6 gennaio 2007.
  24. ^ Linux kernel patch for Intel Compiler
  25. ^ Operating system Family, Top 500 Supercomputer Sites, giugno 2008.
  26. ^ ldd /usr/bin/kwin lists 40 shared libraries (kwin 3.5.5a); ldd /usr/bin/gnome-panel lists 68 (gnome-panel 2.14.3).
  27. ^ Daniel Barlow, The Linux ELF HOWTO, 13 settembre 1995. URL consultato il 19 luglio 2007.
  28. ^ David A. Wheeler, Linux Kernel 2.6: It's Worth More!.
  29. ^ Economic impact of FLOSS on innovation and competitiveness of the EU ICT sector, Tabella 3 di pagina 50.
  30. ^ Linux: 2.6.16.y Lives On | KernelTrap
  31. ^ Linux: Maintaining A 2.6.16.y Tree | KernelTrap
  32. ^ The Linux Kernel Archives
  33. ^ linux-next and patch management process [LWN.net]
  34. ^ Linux Kernel Archives - Volume 1 (Riley Williams)
  35. ^ David Weinehall, [ANNOUNCE] Linux-kernel 2.0.40 aka ``The Moss-covered Tortoise, 8 febbraio 2004. (archiviato dall'url originale il 30 maggio 2012).
  36. ^ Marc-Christian Petersen, Linux 2.2.27-rc2, 13 gennaio 2005. (archiviato dall'url originale il 30 maggio 2012).
  37. ^ Willy Tarreau, Linux 2.4.37-rc1, 7 settembre 2008.
  38. ^ Adrian Bunk, Linux 2.6.16.62 in linux-kernel, 21 luglio 2008.
  39. ^ Per l'elenco completo vedi Linux MAINTAINERS file.
  40. ^ Linux Kernel Mailing List, Linux 2.6.12, 17 giugno 2005.
  41. ^ (EN) Kernel 1.0 Source Code Release. URL consultato il 27 ottobre 2008.
  42. ^ (EN) Kernel 1.2 Source Code Release. URL consultato il 27 ottobre 2008.
  43. ^ (EN) Kernel 2.0.x Source Code Releases. URL consultato il 27 ottobre 2008.
  44. ^ (EN) Kernel 2.2.x Source Code Releases. URL consultato il 27 ottobre 2008.
  45. ^ (EN) The Wonderful World of Linux 2.2. URL consultato il 27 ottobre 2008.
  46. ^ (EN) Kernel 2.4.x Source Code Releases. URL consultato il 27 ottobre 2008.
  47. ^ (EN) The Wonderful World of Linux 2.4. URL consultato il 27 ottobre 2008.
  48. ^ (EN) Kernel 2.6.x.y Source Code Releases. URL consultato il 27 ottobre 2008.
  49. ^ Altri dettagli sulla storia della serie 2.6 del kernel possono essere trovati sul ChangeLog situato in the 2.6 kernel series source code release area
  50. ^ Linux Device Drivers, 2nd Edition: Chapter 2: Building and Running Modules
  51. ^ Gmane Loom
  52. ^ Linux Kernel Documentation :: make : headers_install.txt

Bibliografia[modifica | modifica sorgente]

Voci correlate[modifica | modifica sorgente]

Altri progetti[modifica | modifica sorgente]

Collegamenti esterni[modifica | modifica sorgente]