Nel gennaio 1992 una discussione tecnica su Usenet mise a confronto due visioni molto diverse del futuro dei sistemi operativi.
Andrew Tanenbaum definì Linux “obsoleto” in un messaggio pubblicato il 29 gennaio nel gruppo comp.os.minix. Il bersaglio era il progetto appena avviato da Linus Torvalds, giudicato troppo legato ai processori Intel e fondato su un’architettura che Tanenbaum considerava superata.
Il creatore di MINIX, infatti, all’epoca ha spiegato come “La maggior parte dei sistemi operativi meno recenti è di tipo monolitico; ciò significa che l’intero sistema operativo è costituito da un unico file eseguibile (in formato a.out) che viene eseguito in “modalità kernel”. Tale file binario comprende le funzionalità di gestione dei processi e della memoria, il file system e le altre componenti. Esempi di sistemi di questo tipo sono UNIX, MS-DOS, VMS, MVS, OS/360, MULTICS e molti altri“.
A distanza di oltre tre decenni, quella previsione offre un interessante punto di osservazione sull’evoluzione del software libero. Linux non è rimasto confinato ai personal computer compatibili con IBM: il suo codice ha raggiunto architetture differenti e oggi costituisce anche la base tecnica di Android, mentre il dibattito originario continua a essere studiato come uno dei confronti più celebri nella storia dei sistemi operativi.
La critica del 1992 riguardava l’architettura
Il punto centrale della disputa non era soltanto la giovane età di Linux, ma la struttura del suo kernel monolitico. In un sistema di questo tipo componenti come driver e filesystem operano nello spazio privilegiato del kernel. Tanenbaum sosteneva invece il modello microkernel associato a MINIX, nel quale le funzioni fondamentali vengono mantenute separate dai servizi che possono essere eseguiti come processi distinti.
La seconda obiezione riguardava la portabilità. La prima versione di Linux era stata sviluppata per l’Intel 80386 e Tanenbaum riteneva rischioso costruire un nuovo sistema operativo attorno a una specifica famiglia di processori. La discussione coinvolse rapidamente anche altri sviluppatori e toccò questioni come gestione dei driver, prestazioni, disponibilità del codice e possibilità di trasferire il kernel su piattaforme differenti. La documentazione storica della conversazione mostra che Torvalds difese apertamente le proprie scelte, sostenendo che il progetto poteva essere portato su hardware diverso.
L’evoluzione successiva fornì una risposta concreta alla questione della portabilità. Linux arrivò infatti su numerose architetture, tra cui ARM, MIPS, PowerPC e SPARC. La caratteristica importante non consisteva quindi nell’aver eliminato la struttura monolitica, ma nell’averla sviluppata fino a renderla utilizzabile su una varietà molto più ampia di piattaforme rispetto a quella iniziale.
Linux ha cambiato scala senza diventare un microkernel
La parte più interessante della storia è che Linux non ha seguito la strada architetturale auspicata da Tanenbaum. Il kernel è rimasto monolitico, pur adottando meccanismi che permettono di caricare componenti separatamente. Tra questi ci sono i moduli del kernel, utilizzati per distribuire funzionalità come determinati driver senza incorporarle necessariamente in modo statico nell’immagine principale.
La diffusione su dispositivi diversi dai PC ha poi reso la portabilità una caratteristica concreta. Android, secondo la documentazione ufficiale di Google, utilizza un kernel Linux LTS come base e aggiunge modifiche specifiche attraverso gli Android Common Kernels. L’architettura moderna separa inoltre il codice generico dai moduli forniti dai produttori mediante il Generic Kernel Image e il Kernel Module Interface.
La vicenda non dimostra che Tanenbaum avesse torto su ogni aspetto tecnico. Un microkernel può offrire vantaggi nell’isolamento dei componenti e nella gestione dei guasti, mentre un’architettura monolitica presenta compromessi differenti. La previsione secondo cui Linux sarebbe rimasto un progetto legato al 386, però, non si è realizzata. La storia del progetto mostra piuttosto come una scelta iniziale possa essere modificata attraverso portabilità, modularità e sviluppo continuo, senza abbandonare l’architettura di base.