Spesso si tende ad accomunare le distribuzioni Linux con MacOS, questo perché entrambi sono sistemi Unix-like e sfruttano la stessa shell con tool e comandi praticamente identici fra i due sistemi. Ma ovviamente tra Linux e MacOS esistono notevoli differenze, i loro kernel ad esempio hanno origini molto diverse e sfruttano concetti e paradigmi distanti in alcuni aspetti.
Il kernel di MacOS deriva direttamente del kernel Mach, sviluppato nell'Università di Carnegie Mellon dai ricercatori Richard Rashid e Avie Tevanian che sfruttarono parti del codice di BSD. In particolare Avie Tevania andò a lavorare per NeXT la società che successivamente fu assorbita da Apple ed il suo sistema NeXSTEP divenne la base che diede origine a MacOS e al suo kernel oggi conosciuto come XNU (XNU is Not Unix).
Si tratta di un kernel ibrido che sfrutta concetti provenienti sia dai kernel monolitici che da microkernel. Il codice proveniente da BSD è stato implementato per garantire i servizi di user-space server e gestisce anche:
- il process model;
- gli user id, i permessi e le security policy di base;
- le POSIX API e le chiamate di sistema BSD style;
- lo stack TCP/IP, il BSD sockets ed il firewall;
- il VFS ed i file system;
- il System V IPC;
- i crypto framework;
- i meccanismi di sincronizzazione.
Mentre il codice del kernel Mach si occupa del resto ovvero:
- il preemptive multitasking, inclusi i kernel threads;
- la memoria protetta;
- il virtual memory management;
- le comunicazioni interprocesso;
- l'interrupt management;
- il supporto real-time;
- il supporto al kernel debugging;
- la console I/O.
Anche l'I/O Kit del kernel di MacOS differisce dai sistemi operativi tradizionali, il device driver framework object-oriented di XNU utilizza infatti un ristretto numero di subset di C++ (basate sull'Embedded C++) che includono:
- la gestione delle eccezioni;
- l'ereditarietà multipla;
- i template;
- l'RTTI (run-time type information).
Il kernel Linux invece non nasce come un progetto commerciale, Linus Torvalds l'ha concepito come progetto personale perché scontento del sistema operativo Minix che offriva un pessimo supporto ai processori 80386. Torvalds sviluppò dunque una nuova soluzione ottimizzata in modo specifico per il processore che possedeva; dopo aver pubblicato in rete le prime versioni del codice ricevette feedback molto positivi e in poco tempo Linux venne integrato con il sistema GNU, che non aveva ancora un kernel maturo, e da questa unione hanno avuto origine tutte le distribuzioni GNU/Linux.
Il kernel Linux viene sfruttato oggi in migliaia di progetti commerciali e non, il suo successo derivata dall'elevata flessibilità e dalla sua licenza, la GPL, che gli ha permesso di diffondersi ovunque anche grazie alla community delle distribuzioni. Oggi Linux, con 27 anni di sviluppo continuo alle spalle, si trova praticamente in ogni device IoT, sui nostri cellulari e anche in diverse Smart TV, senza contare i computer di bordo delle automobili più moderne.
Anche il kernel Linux viene spesso definito come un ibrido, infatti al suo interno sono integrati dei concetti provenienti dal mondo dei microkernel, sostanzialmente rimane però un kernel monolitico e dunque responsabile di tutti gli aspetti di gestione del sistema e dell'hardware su cui viene eseguito.
Solitamente i kernel monolitici sono più complessi da aggiornare e gestire perché maggiormente intrecciati con i vari aspetti del sistema operativo, dunque per aggirare questo malus i developer hanno realizzato il sistema dei Kernel Modules che consente di aggiungere al volo nuove funzionalità anche senza riavvio. In buona sostanza l'intero kernel può essere sostituito senza che il sistema subisca conseguenze.
Il sistema dei Kernel Modules è stato quindi strutturato per aggiungere nuove funzionalità al kernel Linux, ad esempio si può aggiungere il supporto ad un determinato device, ad un file system, e si possono anche generare delle chiamate di sistema. Questi loadable kernel module (LKM) hanno anche una loro estensione, .ko, e solitamente vengono collocati all'interno della directory /lib/modules. Il sistema sa sempre dove andarli a reperire ed è possibile definire quali moduli caricare al boot del sistema oltre poterli avviare al volo tramite il comando modprobe.
Esistono anche moduli proprietari che le distribuzioni come Ubuntu integrano nei loro file ISO, cosi da poter 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 possono essere caricati come moduli sul kernel Linux, in modo da fornire il supporto a determinati device o per implementare funzionalità extra.
Questo meccanismo permette alle aziende che non vogliono rilasciare il loro software sotto licenza open source di offrire un supporto diretto al kernel Linux e alle distribuzioni.
Quindi i due kernel hanno delle sostanziali differenze, sia per quanto riguarda la loro origine che relativamente allo sviluppo, oltre ovviamente alla licenze software associate. La GPL infatti consente al kernel Linux di essere sfruttato ovunque senza la necessità di pagare royalty, ecco perché Linux viene utilizzato, con profitto, da migliaia di aziende sparse per il mondo mentre MacOS è relegato sull'hardware di Apple.
Via John Paul