Chiunque lavori con un sistema operativo, lavora anche con un kernel. E spesso senza ren­der­se­ne conto, dal momento che il kernel funziona sempre in back­ground, su­per­vi­sio­nan­do il processo e l’or­ga­niz­za­zio­ne dei dati di ogni computer. Pra­ti­ca­men­te, è re­spon­sa­bi­le di tutte le funzioni del sistema operativo.

Un kernel è let­te­ral­men­te il nucleo di un sistema operativo e quindi l’in­ter­fac­cia tra software e hardware. È la com­po­nen­te centrale di un sistema operativo: per­ma­nen­te­men­te ne­ces­sa­rio e co­stan­te­men­te in uso.

Non è però solo il nucleo del sistema, ma anche un software in­ca­ri­ca­to del controllo di tutti gli accessi al pro­ces­so­re e alla memoria, re­spon­sa­bi­le dei driver più im­por­tan­ti e au­to­riz­za­to ad accedere di­ret­ta­men­te all’hardware. Un kernel è la base per l’in­te­ra­zio­ne tra hardware e software e ne gestisce le risorse nel modo più ef­fi­cien­te possibile.

Registra il tuo dominio
  • Domain Connect gratuito per una con­fi­gu­ra­zio­ne facile del DNS
  • Cer­ti­fi­ca­to SSL Wildcard gratuito
  • Pro­te­zio­ne privacy inclusa

Cos’è un kernel?

Il kernel si trova al centro del sistema operativo e controlla tutte le funzioni più im­por­tan­ti di un hardware, sia che si tratti di un sistema Linux, macOS o Windows, di uno smart­pho­ne, un server o persino di una vir­tua­liz­za­zio­ne, come ad esempio KVM, o qualsiasi altro tipo di computer.

La struttura di un kernel

Un kernel ha sempre la stessa struttura e consiste di diversi layer (livelli):

  • Al livello più basso troviamo l’in­ter­fac­cia con l’hardware (pro­ces­so­ri, memoria e di­spo­si­ti­vi), seguito dai compiti per il kernel, come i con­trol­ler di rete o i con­trol­ler PCI Express.
  • Sopra a questo c’è la gestione della memoria, re­spon­sa­bi­le per la di­stri­bu­zio­ne della RAM, compresa quella delle prin­ci­pa­li memorie virtuali.
  • Il livello suc­ces­si­vo contiene la gestione dei processi (scheduler), che si occupa della gestione del tempo e quindi permette il mul­ti­ta­sking.
  • A questo segue la gestione dei di­spo­si­ti­vi.
  • Al livello ancora superiore vi è infine il file system. Qui, i processi sono assegnati alle ri­spet­ti­ve aree sulla memoria prin­ci­pa­le o sul disco rigido.

Il fun­zio­na­men­to del processo

Un kernel ac­com­pa­gna e guida tutto il percorso dall’hardware del sistema al software ap­pli­ca­ti­vo. Il suo lavoro finisce dove inizia l’accesso dell’utente: con la Graphical User Interface (GUI), l’in­ter­fac­cia grafica utente. Il kernel confina così di­ret­ta­men­te con la shell (cioè con l’in­ter­fac­cia utente). Si può pensare al kernel come a un nucleo e alla shell come a un anello intorno a quel nucleo.

Che tipo di software è un kernel?

Per capire la funzione di un kernel, può rivelarsi utile pensare alla so­mi­glian­za fonetica di questo termine con la parola inglese (o francese) “colonel” (“co­lon­nel­lo”), a indicare il grado militare, dal momento che sia il co­lon­nel­lo che il kernel sono re­spon­sa­bi­li per la tra­smis­sio­ne e la me­dia­zio­ne dei comandi. Un programma invia “system calls” (“chiamate di sistema”) al kernel, per esempio quando viene scritto un file. Questa chiamata di sistema viene tradotta dal kernel in una serie di comandi inoltrati alla CPU. Per fare questo, il kernel gestisce l’intero set di istru­zio­ni della CPU. Spesso questo processo avviene com­ple­ta­men­te in back­ground senza che gli utenti se ne accorgano.

Quali sono i compiti di un kernel?

Il prin­ci­pa­le compito del kernel è l’ela­bo­ra­zio­ne parallela di diversi processi, ovvero il mul­ti­ta­sking. Da un lato, devono essere ri­spet­ta­ti i limiti temporali e dall’altro, un kernel deve rimanere aperto per ulteriori ap­pli­ca­zio­ni ed esten­sio­ni.

Questa regola può fun­zio­na­re solo con delle eccezioni in un sistema a tempo come il sistema operativo. Pertanto, il kernel serve solo come in­ter­me­dia­rio per il software di sistema, le librerie e il software ap­pli­ca­ti­vo. L’in­ter­fac­cia grafica di un sistema operativo è com­ple­ta­men­te in­di­pen­den­te dal kernel, anche sotto Linux.

N.B.

Nei sistemi mul­tiu­ten­te, il kernel controlla anche i permessi di accesso ai file e ai com­po­nen­ti hardware mostrati anche in tempo reale nel task manager. Quando un processo viene terminato dall’utente tramite task manager, questo istruisce il kernel a terminare il processo e quindi a ri­la­scia­re la memoria allocata.

Quando un computer si avvia, la prima cosa che accade dopo l’avvio è il ca­ri­ca­men­to del kernel in memoria. Questo avviene in un’area protetta, il boo­tloa­der, in modo che il kernel, in qualità di software, non possa essere mo­di­fi­ca­to né can­cel­la­to.

Una volta fatto ciò, il kernel ini­zia­liz­za i di­spo­si­ti­vi collegati e avvia i primi processi. I servizi di sistema vengono caricati, ulteriori processi vengono avviati o fermati, i programmi utente e l’al­lo­ca­zio­ne delle posizioni di memoria vengono avviati.

Come funziona un kernel?

Per ri­spon­de­re a questa domanda è utile una contro-domanda: cosa non è un kernel? Il kernel non è il nucleo di un pro­ces­so­re, bensì il nucleo del sistema operativo. Un kernel non è nemmeno un’API o un framework.

Infatti, i sistemi operativi multi-kernel possono usare diversi core di un pro­ces­so­re multi-core come una rete di CPU in­di­pen­den­ti. Come funziona? At­tra­ver­so la speciale struttura del kernel, che è co­sti­tui­to da un certo numero di com­po­nen­ti diversi:

  • Al livello può basso permette alla macchina di co­mu­ni­ca­re di­ret­ta­men­te con l’hardware, il pro­ces­so­re e la memoria. Nei cinque livelli, le funzioni del kernel sono svariate, dalla gestione dei processi alla gestione dei di­spo­si­ti­vi. Il livello superiore non ha accesso alla macchina ma è re­spon­sa­bi­le del passaggio al software.
  • I software ap­pli­ca­ti­vi girano sul sistema operativo se­pa­ra­ta­men­te dal kernel e accedono solo alle sue funzioni. Senza il kernel, la co­mu­ni­ca­zio­ne tra software e hardware non sarebbe possibile.
  • Diversi processi possono essere eseguiti allo stesso tempo grazie alla capacità di mul­ti­ta­sking del kernel. Ma una CPU può gestire solo un processo alla volta, a meno che il sistema non sia multi-core. Il cambio veloce dei processi, simile dopotutto a un mul­ti­ta­sking, è gestito dallo scheduler.

Le quattro funzioni di un kernel possono essere derivate dai suoi com­po­nen­ti:

  1. Gestione della memoria: controlla quanta RAM viene usata e dove.
  2. Gestione dei processi: determina quali processi possono usare la CPU, quando e per quanto tempo.
  3. Driver del di­spo­si­ti­vo: si occupa dell’in­ter­me­dia­zio­ne tra l’hardware e i processi.
  4. Chiamata del sistema e sicurezza: accetta richieste di servizio dai processi.

Le funzioni di un kernel, se im­ple­men­ta­te cor­ret­ta­men­te, rimangono in­vi­si­bi­li agli utenti. Un kernel, infatti, opera all’interno del suo mondo, lo spazio del kernel. Tutto ciò che l’utente vede (file, programmi, giochi, browser, ecc.), invece, accade nello spazio utente. L’in­te­ra­zio­ne dei due mondi avviene tramite l’in­ter­fac­cia di chiamata di sistema, la System Call Interface (SCI).

Il kernel nel sistema operativo

Per capire come funziona il kernel di un sistema operativo, si può pensare a un computer come se fosse diviso in tre livelli:

  1. Hardware: la base del sistema co­sti­tui­ta da memoria, pro­ces­so­re e di­spo­si­ti­vi di input e output. La CPU esegue letture, scritture e calcoli per la memoria.
  2. Kernel: il nucleo di un sistema operativo. Dice alla CPU cosa fare.
  3. Processi utente: tutti i processi in ese­cu­zio­ne che il kernel gestisce. Il kernel permette la co­mu­ni­ca­zio­ne tra processi e server, co­no­sciu­ta anche come co­mu­ni­ca­zio­ne tra processi (IPC).

Esistono fon­da­men­tal­men­te due modalità per il codice in un sistema: modalità kernel e modalità utente. Il codice in modalità kernel ha accesso il­li­mi­ta­to all’hardware, mentre il codice in modalità utente ha accesso limitato al SCI. Quando si verifica un errore in modalità utente, non succede granché, dal momento che lo stesso kernel in­ter­vie­ne per cor­reg­ge­re i possibili danni. D’altra parte, un crash del kernel può com­pro­met­te­re l’intero sistema, ma per evitare che ciò accada possono essere adottate delle pre­cau­zio­ni di sicurezza.

Quali tipi di kernel esistono?

In questo articolo è già stato descritto un tipo di kernel: quando su un kernel girano più processi allo stesso tempo, sono presenti i co­sid­det­ti kernel mul­ti­ta­sking. L’aggiunta della gestione degli accessi lo trasforma in un sistema mul­tiu­ten­te su cui diversi utenti possono lavorare si­mul­ta­nea­men­te. L’au­ten­ti­ca­zio­ne è eseguita dal kernel, che può allocare o separare i processi chiamati.

In cosa consiste un kernel open source?

Linux gestisce un ampio archivio di kernel. Apple ha già reso di­spo­ni­bi­li i tipi di kernel di tutti i suoi sistemi operativi come open source. Anche Microsoft usa un kernel Linux per il suo Windows Subsystem for Linux.

N.B.

Per quanto riguarda i diversi tipi di kernel, ne esistono mol­te­pli­ci: i sistemi Linux e i di­spo­si­ti­vi Android usano kernel Linux, Windows usa il kernel NT su cui sono costruiti diversi sot­to­si­ste­mi, mentre Apple usa un kernel XNU.

I tre tipi di kernel

Esistono diversi tipi di kernel per diversi sistemi operativi e di­spo­si­ti­vi finali. In termini di ca­rat­te­ri­sti­che, si distingue tra tre diverse tipologie:

  1. Kernel mo­no­li­ti­co: un unico grande kernel per tutti i compiti. È l’unico re­spon­sa­bi­le della gestione della memoria, dei processi e della co­mu­ni­ca­zio­ne tra processi, oltre a fornire funzioni per il supporto di driver e hardware. Su questo tipo di kernel si basano i sistemi operativi come Linux, OS X e Windows.
  2. Mi­cro­ker­nel: un mi­cro­ker­nel è in­ten­zio­nal­men­te pro­get­ta­to per essere piccolo in modo da non pa­ra­liz­za­re l’intero sistema operativo in caso di guasto. Affinché possa comunque svolgere le stesse funzioni di un grande kernel, è diviso in diversi moduli. Come esempio di ap­pli­ca­zio­ne in questo caso può essere citato solo il com­po­nen­te Mach di OS X, perché finora non esiste alcun sistema operativo dotato di mi­cro­ker­nel.
  3. Kernel ibrido: la com­bi­na­zio­ne di kernel mo­no­li­ti­co e mi­cro­ker­nel è chiamata kernel ibrido, che rende il kernel più compatto e mo­du­la­bi­le. Altre parti del kernel possono essere caricate di­na­mi­ca­men­te. Questo sta già accadendo in una certa misura sotto Linux e OS X.
Vai al menu prin­ci­pa­le