# Linux (kernel)

Linux è un kernel, creato nel 1991 da Linus Torvalds e derivato da UNIX, distribuito sotto licenza di software libero GNU GPLv2 (anziché software proprietario), comprendente anche diversi firmware sotto licenze non-libere. Utilizzato spesso congiuntamente al sistema operativo GNU, ideato da Richard Stallman, ha dato vita alla famiglia di sistema operativo Linux, diffusi nelle varie distribuzioni (l'accesso diretto al kernel da parte dell'utente/amministratore in modalità user mode/kernel mode si ha attraverso la cosiddetta Linux console). L'attività di sviluppo, promossa dalla Linux Foundation, ha portato ad una standardizzazione nota come Linux Standard Base, mentre un tentativo di implementazione di un kernel completamente libero è rappresentata da Linux-libre.

## Storia

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, 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 pubblica la versione 0.02 del kernel, circa un mese dopo della pubblicazione della versione 0.01, che però non ebbe grande successo. Egli scrisse, in occasione della pubblicazione, il seguente post:
«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.) È 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) ed 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. Nel 31 marzo 1992, alt.os.linux divenne comp.os.linux.
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 pubblicate 15 versioni della versione 0.99.
Il 14 marzo 1994 fu pubblicato Linux 1.0.0, con 176.250 linee di codice. A marzo del 1995, fu pubblicato Linux 1.2.0 (310 950 linee di codice).
La versione 2 di Linux, pubblicata il 9 giugno 1996, fu seguita da altre versioni maggiori sotto il prefisso della versione 2:
* 25 gennaio 1999 - Pubblicazione di Linux 2.2.0 (1 800 847 linee di codice).
* 18 dicembre 1999 - Furono pubblicate le patch per supportare l'architettura dei mainframe IBM System/390 nella versione 2.2.13, che permisero a Linux di essere installato su macchine di livello enterprise.
* 4 gennaio 2001 - Pubblicazione di Linux 2.4.0 (3 377 902 linee di codice).
* 17 dicembre 2003 - Pubblicazione di Linux 2.6.0 (5 929 913 linee di codice).
* 9 ottobre 2008 - Pubblicazione di Linux 2.6.27 (9 709 868 linee di codice).
* 24 dicembre 2008 - Pubblicazione di Linux 2.6.28 (10 195 402 linee di codice).
* 20 ottobre 2010 - Pubblicazione di Linux 2.6.36 (13 499 457 linee di codice).
* luglio 2011, per festeggiare il 20º anniversario della nascita di Linux, Torvalds ha deciso di passare ad un sistema di numerazione a 2 cifre, pubblicando la versione 3.0 del kernel. L'ultima versione della serie 2.6 è stata la 2.6.39. La prima versione del nuovo sistema di numerazione adottato - la 3.0 - pubblicata contiene 14 646 952 righe di codice.
* 8 marzo 2015 - Viene pubblicata la prima beta della nuova versione 4.0 del kernel.
* 12 marzo 2015 - Viene pubblicata la versione stabile di Linux 4.0 e da ora la numerazione prevederà solo un numero decimale.

### Il dibattito Tanenbaum-Torvalds

Il fatto che Linux sia un kernel monolitico piuttosto che un microkernel è stato l'argomento del dibattito Tanenbaum-Torvalds. Il dibattito iniziò nel 1992 riguardo Linux e l'architettura del kernel in generale sul gruppo di discussione Usenet comp.os.minix. 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 e il 12 maggio 2006.

## Descrizione

Il kernel Linux, uno dei più riusciti esempi di software open source, costituisce il nucleo dei sistemi operativi della famiglia di Linux ovvero le distribuzioni Linux. Fu inizialmente creato nel 1991 da alcuni studenti di informatica finlandesi tra cui Linus Torvalds, il capogruppo. Successivamente aumentarono in modo repentino i suoi sviluppatori ed utilizzatori che aderivano al progetto del software libero e contribuivano allo sviluppo del nuovo sistema operativo.
Pubblicato, liberamente scaricabile e modificabile/personalizzabile sotto la licenza libera GNU GPL (insieme ad alcuni firmware con varie licenze), è continuamente e liberamente sviluppato da collaboratori di tutto il mondo attraverso la relativa community, con lo sviluppo che ogni giorno avviene sfruttando la relativa mailing list, in modo del tutto analogo in cui sono sviluppati i protocolli di Internet. Il codice sorgente di Linux è dunque disponibile a tutti ed è ampiamente personalizzabile, al punto da rendere possibile, in fase di compilazione, l'esclusione di codice non strettamente indispensabile.
Come ogni progetto che sia software libero, anche il kernel Linux è dunque in continua evoluzione con la dimensione del kernel che cresce in maniera esponenziale, aggiungendo nuovi moduli, nuovo hardware supportato e così via. Il ramo di sviluppo principale del kernel Linux prevede che esso contenga anche alcune parti non-libere, offuscate od oscurate come ad esempio alcuni driver. Il progetto Linux-libre si propone invece come variante completamente libera di Linux, da cui sono nate diverse distribuzioni completamente libere.
In quanto "cuore" di un sistema operativo (nucleo) 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.
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. Supporta dunque il multitasking ed è multiutente: 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).
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. La flessibilità di questo kernel lo rende adatto a tutte quelle tecnologie embedded emergenti e anche nei centri di calcolo distribuito (come il cluster Beowulf) fino ad essere incorporato in alcuni videoregistratori digitali e nei telefoni cellulari.

### Architettura

Linux è un kernel monolitico. 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).
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. 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 sistema multiprocessore simmetrico (SMP). La preallocazione inoltre migliora la latenza, incrementando la reattività e rendendo Linux più adatto ad applicazioni in tempo reale.

### Portabilità

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ù del 97% dei sistemi nella classifica Top 500 dei supercomputer. Inoltre, Linux è stato compilato in numerosi dispositivi portatili come TuxPhone e l'iPod di Apple.

### Linguaggi di programmazione

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.
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 shell. 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.

### Opzioni di Compilazione

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.

### Oggetti Kernel

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

### Header kernel

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.
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. Quando esportati, la maggior parte degli header del kernel si trovano nelle cartelle /usr/include/asm e /usr/include/linux

### 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 Indirizzo 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 boot loader, ad esempio l'immagine initrd.

### Formati binari supportati

Linux 1.0 supportava il formato binario a.out e l'ELF, che semplifica la creazione di librerie condivise (molto utili per un sistema operativo moderno). ELF è il formato standard usato da GCC fin dalla versione 2.7.0, oggigiorno a.out è deprecato e non più supportato dal kernel.
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.

### Architetture delle macchine virtuali

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 con architettura x86, sebbene in alcuni casi siano emulati anche i processori PowerPC o AMD64.

## Versioni

Mentre sviluppa il proprio codice e integra le modifiche create da altri programmatori, Linus Torvalds continua a pubblicare nuove versioni del kernel di Linux. Queste sono chiamate versioni "vanilla", a 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 pubblicate come stabili, mentre altre distribuzioni usano un kernel vanilla.

### Modello di sviluppo

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 pubblicare kernel 2.6.16.y anche quando fosse stata pubblicata la versione 2.6.17. 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.
Il 10 ottobre 2008, è stata pubblicata la versione stabile 2.6.27.. 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.
Nel luglio del 2011, per festeggiare il 20º anniversario della nascita di Linux, Torvalds ha deciso di pubblicare la versione 3.0 del kernel, passando ad un sistema di numerazione a 2 cifre. L'ultima versione della serie 2.6 è stata la 2.6.39.

### Controllo versione

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 richiesti 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 ideò un nuovo sistema di controllo di versione, chiamato git, scrivendo la prima versione di tale software in poche settimane. Due mesi dopo si ebbe la prima versione ufficiale del kernel Linux pubblicata con git. Poco dopo git è diventato un progetto indipendente, guadagnandosi un'ampia diffusione nella comunità del software libero.

### Manutenzione

Linus Torvalds è il supervisore dei cambiamenti e della pubblicazione 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 pubblicato 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 |
| 2.2 | 2.2.27-rc2 | Marc-Christian Petersen (ex supervisore Alan Cox) |
| 2.4 | 2.4.37-rc2 | Willy Tarreau (ex supervisore Marcelo Tosatti) |
| 2.6.16 | 2.6.16.62 | Adrian Bunk |
| 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.

### Numerazione delle versioni

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 la pubblicazione di una revisione minore (che sarebbe diventata la versione 2.6.9), così, il 2.6.8.1 venne pubblicato, 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 versione 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.

#### Versioni storiche

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 pubblicata sotto licenza GNU General Public License), 0.95, 0.96, 0.97, 0.98, 0.99, e dalla 1.0. Dalla versione 0.95 a queste, sono state pubblicate numerose patch tra le versioni.

#### Cronologia della versione stabile

Ci sono state due versioni maggiori stabili del kernel Linux 1.x: la 1.0 e la 1.2. La versione 1.0 fu pubblicata il 14 marzo 1994 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 (pubblicata il 7 marzo 1995) incorporò il supporto per i sistemi basati su architetture DEC Alpha, SPARC, e MIPS. Questa fu l'ultima versione stabile pubblicata 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 pubblicata. 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 pubblicata il 9 giugno 1996. Ci furono 41 pubblicazioni 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 (pubblicata il 26 gennaio 1999) 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). 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, pubblicata il 4 gennaio 2001, conteneva il supporto per ISA Plug and play, USB, e PC Card. 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 versione x e l'altra, mentre le versioni y sono solitamente riservate alla correzioni di bug. La versione 2.6.0 fu pubblicata il 18 dicembre 2003.. 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 2$^{32}$ (2$^{16}$ nelle versioni precedenti), il supporto a un numero di processi fino a 2$^{30}$ (2$^{15}$ 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 andLinux e di SELinux, supporto a Infiniband, e molto altro. Altrettanto importante è l'aggiunta di diversi filesystem durante le varie versioni della serie 2.6.x: FUSE, JFS, XFS, ext4 e altri.
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, pubblicando la versione 3.0 del kernel. L'ultima versione della serie 2.6 è stata la 2.6.39.
Il 12 marzo 2015 viene pubblicata la versione stabile di Linux 4.0.

### Costo stimato per lo sviluppo

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.
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.

## Aspetti legali
### Marchio registrato

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.

### Termini di licenza

Inizialmente, Torvalds pubblicò 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 pubblicate 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."

#### GPL versione 3

Attualmente, Linux adotta la versione 2 della licenza GPL, senza nessuna opzione (a differenza di molti programmi pubblicati 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). Torvalds stesso ha specificato durante la pubblicazione della versione 2.4.0 che il suo codice adotta soltanto la versione 2 della licenza. 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 coloro che contribuiscono a Linux hanno specificato una particolare versione della licenza GPL. Un blogger ha concluso che circa il 40% del codice di Linux è specificatamente pubblicato 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».

### Moduli kernel caricabili e firmware

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." 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).
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 GNU/Linux.

### Contenzioso SCO

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, Daimler (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. Ad agosto 2007, la corte nel caso Novell stabilì, per cominciare, che SCO non possedeva neanche i diritti di copyright su Unix.