In una precedente lezione abbiamo parlato delle origini di Linux soffermandoci sul fatto che esso è soltanto il kernel del sistema operativo GNU/Linux. Abbiamo anche accennato al ruolo che ricopre il kernel; in questo articolo approfondiremo alcuni lati di questa parte del sistema operativo cercando di dare alcuni suggerimenti per la sua compilazione. Come già detto il kernel ha il compito di amministrare le risorse presenti sul nostro sistema, rendendole disponibili ai processi. In questo modo si evita di far accedere i programmi direttamente a memoria, CPU, ecc. Ciò porta a una migliore organizzazione, stabilità, e maggiori performance.
Esistono fondamentalemente due tipi di kernel: "monolitico" e "microkernel". Le differenze tra i due tipi sono enormi e spesso sono nate anche delle forme ibride. Senza soffermarci troppo su questioni tecniche che potrebbero risultare noiose, ci sembra doveroso sottolineare le differenze tra i due e quali sono state le motivazioni che hanno portato Linus a preferirne uno tra questi modelli.
Un kernel monolitico ha il vantaggio essere strutturato in un unico file, risultando quindi piu' veloce, semplice e lineare. Un microkernel invece ha una struttura piu' complessa e articolata: è basato su un unico nucleo che si occupa soltanto di gestire il passaggio di messaggi alle altri componenti che sono staccate dal kernel. Queste ultime inoltre girano in "userspace". In questo modo ogni parte del kernel è completamente distinta dalle altre che vengono coordinate mediante lo scambio di messaggi. Questo tipo di kernel deve preoccuparsi solo di gestire questi messaggi e di amministrare le risorse delegando quest'ultimo compito a dei processi esterni (server). Ciò permette di aver un kernel molto snello a scapito (seppur di poco) delle prestazioni.
Linux è basato sulla prima tipologia. Ciò fu oggetto di discussione tra Linus Torvalds e Andrew S. Tanenbaum, creatore del sistema operativo MINIX, dal quale Torvalds prese spunto per Linux. Nonostante Linux si ispirasse a MINIX che era un microkernel, Linus decise di optare per un kernel monolitico. La tesi di Tanenbaum era fondata soprattutto sul fatto che quella dei kernel monolitici era una tecnologia ormai obsoleta e anche Linux rischiava di diventare obsoleto già prima di nascere. A queste accuse Torvalds rispose che Linux già per il fatto stesso di esistere era vincente: Hurd, il kernel (microkernel) su cui si doveva basare il sistema operativo GNU di Richard Stallman, non era ancora maturo e Linux poteva sopperire a questa mancanza. Tanenbaum (che era professore di Sistemi Operativi) concluse una sua email dicendogli: «I still maintain the point that designing a monolithic kernel in 1991 is a fundamental error. Be thankful you are not my student. You would not get a high grade for such a design» («Rimango ancora dell'idea che progettare un kernel monolitico nel 1991 è un errore di strutturazione. Sei fortunato che non sei un mio studente. Non prenderesti un buon voto per un tale progetto») Chissà se si è ricreduto di tale affermazione...
Tuttavia la complessità alla quale sta arrivando Linux ha di nuovo aperto il dibattito sull'opportunità di rivedere la struttura stessa del kernel. La posizione di Torvalds a proposito però non è cambiata. Recentemente hanno fatto discutere alcune sue affermazioni nella sua biografia "Just for Fun: The Story of an Accidental Revolutionary" nella quale descrive il kernel MACH (microkernel creato dalla Carnegie Mellon University nel 1985 sul quale è basato MacOS X) come pieno di errori di progettazione e spazzatura. Il kernel Linux si differenzia dalla maggior parte dei kernel monolitici per una interessante caratteristica: pur essendo basato su un nucleo compatto ha la possibilità di "collegare" a questo nucleo dei moduli, in modo da allegerire il kernel e aggiungere alcuni supporti solo se ce ne è l'effettiva necessità. Bisogna prestare attenzione che questo tipo di approccio si differenzia notevolmente da quello dei microkernel (dove i moduli comunicano per mezzo di messaggi, e non vengono "agganciati" al nucleo principale facendone parte), ma che permette di alleggerire notevolmente il kernel.