Lo strato più basso del "sistema operativo" quello a contatto con la macchina è il kernel, esso per grandi linee ha il compito di gestire le risorse presenti nel sistema, rendendole disponibili ai processi. Quando si fa riferimento a un kernel in cui tutte le "procedure" che servono per la gestione delle risorse del sistema sono incluse in un unico file, si dice che il kernel è monolitico (un unico blocco), quando le "procedure" sono tutte esterne al kernel vero è proprio, contenute ed organizzate cioè in moduli che verrano poi richiamate dal kernel tutte le volte che ce ne sarà bisogno, allora si dice che il kernel è un microkernel. Vi è poi una forma ibrida derivata da entrambe le due tipologie sopra descritte, ovvero il modulare dove le componenti principali del kernel sono caricate in un unico blocco (gestore dei processi, della memoria ecc..) e la possibilità di caricare/scaricare moduli secondo le proprie esigenze.
Andiamo ad analizzare le differenze delle due tipologie di kernel; partiamo dal monolitico esso ha il vantaggio di contenere tutte le sue parti in un unico tutto in un file, dunque è molto veloce ma allo stesso tempo è rigido e non permette di liberare risorse quando le unità periferiche gestite non servono.
Il microkernel non è altro che un gestore di "chiamate" tra moduli e risorse ovvero, esso non comprende al suo interno il gestore della memoria dei processi e tutto il resto de un normale kernel monolitico, ogni parte è rappresentato da un modulo che viene caricato e con cui il kernel "dialoga" durante il funzionamento; esso dunqe non fa altro che dialogare con tutti i moduli e mette in comunicazione, quando occorre, i moduli tra loro (dunque dialoga e fa dialogare attraverso se stesso). I vantaggi si hanno nella stabilità, immaginate di avere un kernel monolitico ed un microkernel che stanno lavorando ad uno stesso compito, se per qualche motivo vi è qualcosa che non va, se il monolitico deve crashare perchè una delle sue parti va in loop o altro, sarà tutto il sistema a crashare rendendo la macchina "inutilizzabile" fino al ricaricamento del kernel in memoria. Se abbiamo un microkernel, se un modulo di esso crascha sarà possibile interrompere il suo processo e riavviarlo senza che tutto il sistema ne risenta (non occorre riavviare la macchina questa volta) inoltre essendo operazioni molto semplici quelle svolte dal microkernel (semplice dialogo e gestione di quando un modulo va caricato, scaricato ecc..) è molto meno probabile che esso crashi rispetto ad un monolitico.
Veniamo ora al modulare, abbiamo sopra detto che esso è una forma ibrida tra le due tipologie, monolitico e microkernel, esso è costituito da una parte centrale che comprende la struttura classica di un kernel (gestore della memoria, schedulatore ecc..) e da n parti rappresentate dai moduli (generalmente ogni periferica ha un modulo ecc..). Questa via di mezzo permette come tutti i compromessi di ottenere velocità e stabilità accettabili prendendo il meglio delle due tipologie "standard".
I kernel free presenti fino a questo momento sono sostanzialmente 4, vi è il kernel Linux, il kernel 386BSD, il kernel Hurd/Mach e il Neutrino.
Il kernel Linux creato da Linus Torvalds, permette di scegliere se compilare un monolitico o un modulare (che è la scelta più frequente per il settore desktop e per i server di fascia medio-bassa);
il kernel 386BSD (nelle varie forme FreeBSD, OpenBSD e NetBSD) è un kernel modulare della Berkeley Software Distribution;
il kernel Hurd/Mach è il microkernel del progetto GNU;
il kernel Neutrino è la versione free del kernel QNX della QNX Software Systems ed è un microkernel.
Ora cè da dire una cosa molto importante, i vantaggi e gli svantaggi vanno rapportati al settore di utilizzo degli stessi ad esempio, negli ambienti come quello medico o aereospaziale viene utilizzato un microkernel, in particolare il leader del settore è l'OS QNX (che è un derivato dallo unix) cn il suo microkernel opportunamente configurato. Sono utilizzati cioè in ambienti dove non si può rinunciare all'alta stabilità ma si può perdere in velocità. Un altro vantaggio è quello di esere più facilmente realizzato il porting su diverse piattaforme perchè per sua natura gli si possono caricare i moduli dedicati, esso si occupa solo del dialogo con e tra gli stessi. Sulla scelta del tipo di kernel vi sono sempre state diverse diatribe, la più famoso credo sia quella tra il prof. Andrew S. Tanenbaum creaore del minix (progenitore di Linux) e il creatore del kernel Linux Linus Torvalds. Il prof. Tanenbaum accusò a suo tempo(e ancora oggi di tanto in tanto lo punzecchia...) di aver realizzato un kernel oramai passato per quel periodo, a suo dire era impenzabile concepire ancora un kernel monolitico e/o modulare, affermo persino che se Torvalds fosse stato suo alunno con quel progetto non avrebbe passato il suo esame. La storia ha poi espresso il suo parere riconducendoci fino ad oggi.
Oggi il kernel Linux si è dimostrato molto efficiente, stabile e duttile, arrivando grazie alla sua struttura a girare molte piattaforme in settori diversi; lo si comincia a a trovare anche nei settori industriali nei sistemi real-time, cioè in sistemi embedded dove deve lavorare con poca quantità di memoria e dove la stabilità è un fattore di assoluta rillevanza.