I sistemi Unix-like tendono ad assomigliarsi perché spesso abbracciano paradigmi molto simili se non identici. Ad esempio le similitudini tra MacOS e le distribuzioni Linux sono diverse, ma quali sono le principali differenze? Per comprenderle si deve partire dalla radice ovvero dai rispettivi kernel. Il kernel Linux e il kernel MacOS nascono in contesti molto diversi e hanno un modo di funzionare concettualmente differente.
Kernel Linux
Linus Torvalds ha inizialmente pensato Linux come suo progetto personale, questo perché era insoddisfatto del sistema operativo Minix. Torvalds sviluppò dunque una nuova soluzione ottimizzata in modo specifico per il processore che possedeva. Non si aspettava un tale successo né che il suo piccolo progetto personale venisse integrato alla perfezione con il sistema operativo GNU, dando vita alle moderne distribuzioni GNU/Linux che vengono sfruttate in migliaia di progetti commerciali oltre che nelle pubbliche amministrazioni e nei PC personali di milioni di persone.
Il successo del progetto di Linus Torvalds deriva dalla grande elasticità del kernel Linux e ovviamente dalla sua licenza, la GPL, che gli ha permesso di diffondersi ovunque senza che i team di terze parti dovessero pagare una licenza proprietaria. Il fatto di non averlo pensato come progetto commerciale ha permesso a milioni di aziende sparse per il mondo di adottare Linux per far crescere, o nascere, il proprio business senza dover pensare a ripercussioni legali o royalties.
Il kernel Linux viene spesso definito come un ibrido, questo perché al suo interno sono integrati dei concetti provenienti dal mondo dei microkernel, ma sostanzialmente rimane un kernel monolitico e dunque responsabile di tutti gli aspetti di gestione del sistema e dell'hardware su cui viene eseguito. I kernel monolitici sono complessi da aggiornare e gestire, perché intrecciati con i vari aspetti del sistema operativo. Per aggirare questo "malus" i developer di Linux hanno implementato un ingegnoso sistema chiamato Kernel Modules, che consente di aggiungere al volo nuove funzionalità.
Ad esempio: tramite i loadable kernel module (LKM) è possibile inserire il supporto ad un device, ad un file system, e si possono anche generare delle chiamate di sistema senza che l'utente debba eseguire un reboot e ovviamente senza che il sistema diventi instabile. Tali kernel module sono identificati tramite l'estensione .ko e solitamente vengono collocati all'interno della directory /lib/modules cosi da essere intercettati dal sistema al boot anche se è possibile caricarli al volo tramite il comando modprobe.
Esistono anche moduli proprietari che le distribuzioni come Ubuntu integrano nei loro file ISO, cosi da offrire sin dal primo boot un'esperienza ottimizzata per determinati hardware. I produttori molto spesso non distribuiscono direttamente il loro codice sorgente ma si affidano a dei blob binari, che vengono inseriti dentro un kernel module, in modo da fornire il supporto a determinati device o per implementare funzionalità extra senza cambiare la licenza del proprio software.
Il kernel di MacOS
Il kernel di MacOS deriva direttamente del kernel Mach, che venne sviluppato nell'Università di Carnegie Mellon dai ricercatori Richard Rashid e Avie Tevanian usando parte del codice del progetto BSD. Successivamente Avie Tevania si ritrovò a lavorare per NeXT, la società fondata da Steve Jobs che diede la vita al progetto NeXSTEP e che anni dopo, a seguito del rientro di Jobs in Apple, divenne la base di MacOS e del suo kernel chiamato XNU (XNU is Not Unix).
XNU è un kernel ibrido che sfrutta concetti provenienti sia dai kernel monolitici che dai microkernel. Il codice proveniente da BSD è stato implementato per garantire i servizi di user-space server oltre al TCP/IP stack, alle POSIX API, i file system ed i vari meccanismi di sincronizzazione. Tutto il resto invece viene gestito dal codice preso dal Kernel Mach.
Nel dettaglio l'I/O Kit del kernel di MacOS è molto diverso dagli altri OS nel mercato. Per una scelta di sviluppo il device driver framework object-oriented di XNU va a sfruttare solo un ristretto numero di subset di C++ (implementazioni derivate da Embedded C++), come ad esempio: la gestione delle eccezioni, l'ereditarietà multipla, i template e l'RTTI (run-time type information). Da tale scelta di sviluppo ovviamente derivano varie conseguenze a livello di implementazione dei driver per determinati device.
Come è possibile intuire i due kernel hanno delle notevoli differenze, sia come origine e sviluppo iniziale, sia per quanto riguarda le licenze software associate. La GPL infatti ha permesso a Linux di essere sfruttato praticamente ovunque dai normali PC fino ai piccoli elettrodomestici intelligenti. Mentre MacOS è relegato sull'hardware di Apple per una precisa scelta di mercato, la sua "esclusività" è spesso fonte di attrazione per molti utenti, anche se questo non ha permesso a MacOS di essere diffuso tanto quanto altri sistemi operativi.
Via Linuxandubuntu