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 8086 e un driver da terminale. A questo punto, il 25 agosto 1991, Torvalds scrisse un messaggio:
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 la pubblicazione della versione 0.01, che però non ebbe grande successo. Egli scrisse, in occasione della pubblicazione, il seguente post:
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 ( 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 ( 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 ( linee di codice). 17 dicembre 2003 - Pubblicazione di Linux 2.6.0 ( linee di codice). 9 ottobre 2008 - Pubblicazione di Linux 2.6.27 ( linee di codice)"Linux Kernel Data.". 24 dicembre 2008 - Pubblicazione di Linux 2.6.28 ( linee di codice). 20 ottobre 2010 - Pubblicazione di Linux 2.6.36 ( linee di codice)."Linux Kernel Data." 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 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.
E' pubblicato, ai sensi della licenza libera GNU GPLe liberamente scaricabile dal sito ufficiale (kernel.org) e modificabile/personalizzabile (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.
Il kernel Linux è dunque in continua evoluzione, con l'aggiunta di moduli, e nuovo hardware supportato; 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, demand paging, 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 nello spazio kernel (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.
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.
Gli 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.
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.
Molti altri linguaggi possono essere implementati, 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.
Macchine virtuali