Il kernel di Linux consiste di diverse parti importanti: la
gestione dei processi, la gestione della memoria, i driver per i
dispositivi hardware, quelli per i filesystem, la gestione della
rete ed altre parti minori. In Figura 2-1
ne sono mostrati alcuni.
Probabilmente le parti più importanti del kernel (nient'altro
funziona senza di esse) sono la gestione della memoria e dei processi.
La gestione della memoria si occupa di assegnare le aree di memoria e
di spazio di swap ai processi, a parti del kernel e per la cache di
buffer. La gestione dei processi crea i processi ed implementa il
multitasking cambiando il processo attivo sul processore.
Al livello più basso, il kernel contiene un driver per ciascun
dispositivo hardware che supporta. Dato che il mondo è pieno di tipi
diversi di hardware il numero dei driver è enorme. Ci sono spesso
molti componenti hardware simili che differiscono solo in come vengono
controllati dal software; queste similitudini rendono possibile
avere delle classi generali di driver che supportano operazioni simili:
ogni membro della classe ha la stessa interfaccia con il resto
del kernel, ma si distingue in quello che serve per implementarlo.
Ad esempio, tutti i driver dei dischi sembrano uguali dal punto di
vista del resto del kernel, cioè hanno tutti operazioni come
`inizializza il driver', `leggi il settore N' e `scrivi il settore N'.
Alcuni dei servizi software forniti dal kernel stesso hanno
proprietà simili e possono dunque essere astratti in classi. Ad
esempio, i vari protocolli di rete sono stati astratti in
un'interfaccia di programmazione, la BSD socket library. Un altro
esempio è il livello filesystem virtuale
(VFS), che astrae le operazioni su filesystem senza considerare la
loro implementazione. Ciascun tipo di filesystem fornisce
un'implementazione di ogni operazione; quando un'entità prova ad usare
un filesystem, la richiesta passa per il VFS che la gira
al driver opportuno.