Un sistema operativo è fondamentalmente un gestore di risorse hardware, che fornisce un'interfaccia semplificata e indipendente dal dispositivo a quelle risorse (rispetto allo sbattere a mano i registri della CPU o del dispositivo). In questo ruolo facilita anche la condivisione di quelle risorse, quindi è anche responsabile di fornire isolamento e sicurezza tra processi ora separati (o più recentemente macchine virtuali).
Molte di queste funzioni sono fortemente correlate. I processi hanno bisogno sia della CPU che della memoria a loro assegnata. I dispositivi hanno bisogno di memoria e interrupt, e di solito non sono assegnati esclusivamente a un processo, quindi il sistema operativo ha bisogno di condividerli attraverso un livello di astrazione di livello superiore (ad esempio socket, VFS). Il kernel è l'insieme di questi pezzi che sono considerati inseparabili - da qui il nome - e che vengono eseguiti indipendentemente da qualsiasi utente/processo.
Ci sono, naturalmente, differenze di opinione su quale codice sia veramente inseparabile dal resto del kernel e quale codice possa effettivamente essere eseguito (o come) come processi gestiti dal kernel. I microkernel hanno dimostrato secoli fa che molte cose tradizionalmente pensate come funzioni del kernel possono effettivamente essere eseguite in processi separati. Un moderno microkernel come L4[1] può persino funzionare in questo modo con prestazioni paragonabili ai "macrokernel" monolitici come Linux, e con proprietà di sicurezza/robustezza molto migliori.
Linux e altri hanno aggiunto caratteristiche come i moduli caricabili del kernel e i filesystem dello spazio utente per affrontare alcuni dei problemi più pressanti con l'approccio monolitico, ma confondono ancora la terminologia avendo molto codice nel kernel che non ha davvero bisogno di essere lì. In senso pratico, il kernel è davvero l'insieme delle cose scritte e mantenute dalla comunità di sviluppatori del kernel anche quando non rientrano nelle definizioni tradizionali.
[1] http://www.l4hq.org/