Vai al contenuto

Kernel

Da Wikipedia, l'enciclopedia libera.
Disambiguazione – Se stai cercando altri significati, vedi Kernel (disambigua).
Astrazione dal software all'hardware passando per il kernel

Il kernel (AFI: [ˈkɜːnəl]) o nucleo, in informatica, è un programma situato al centro del sistema operativo che ha generalmente un controllo completo dell'intero sistema[1] e fornisce un accesso sicuro e controllato dell'hardware ai processi in esecuzione sul computer.[2] Dato che possono eventualmente esserne eseguiti simultaneamente più di uno, il kernel può avere anche la responsabilità di assegnare una porzione di tempo-macchina (scheduling) e di accesso all'hardware a ciascun programma (multitasking)[3].

Un kernel non è strettamente necessario per far funzionare un computer. I programmi possono essere infatti direttamente caricati ed eseguiti sulla macchina, a patto che i loro sviluppatori ritengano necessario fare a meno del supporto del sistema operativo.

Questa era la modalità di funzionamento tipica dei primi computer, che venivano resettati prima di eseguire un nuovo programma. In un secondo tempo, alcuni programmi accessori come i program loader e i debugger venivano lanciati da una memoria a sola lettura, o fatti risiedere in memoria durante le transizioni del computer da un'applicazione all'altra: essi formarono la base di fatto per la creazione dei primi sistemi operativi.

Un'altra situazione in cui l'assenza di sistema operativo è auspicabile è l'esempio dei microcontrollori monolitici. L'accesso diretto al kernel da parte di un utente/amministratore può avvenire in modalità user mode o kernel mode.

Lo spazio kernel è l'area di memoria protetta in cui risiedono il nucleo del sistema operativo (il kernel) e i suoi componenti essenziali, operando con privilegi elevati per gestire direttamente l'hardware (CPU, RAM, dispositivi) e le risorse di sistema, in contrasto con lo spazio utente (User Space) dove girano le normali applicazioni con accesso limitato e controllato, tramite chiamata di sistema.

Classificazione

[modifica | modifica wikitesto]
Confronto tra i diversi kernel

L'accesso diretto all'hardware può essere anche molto complesso, quindi i kernel usualmente implementano uno o più tipi di astrazione dall'hardware, il cosiddetto livello di astrazione dell'hardware (hardware abstraction layer o HAL). Queste astrazioni servono a "nascondere" la complessità e a fornire un'interfaccia pulita e uniforme all'hardware sottostante, in modo da semplificare il lavoro degli sviluppatori.

I kernel si possono classificare in quattro categorie, in base al grado di astrazione dell'hardware:

  • Kernel monolitici, che implementano direttamente una completa astrazione dell'hardware sottostante.
  • Microkernel, che forniscono un insieme ristretto e semplice di astrazione dell'hardware e usano software (chiamati device driver o server) per fornire maggiori funzionalità.
  • Kernel ibridi (o microkernel modificati), che si differenziano dai microkernel puri per l'implementazione di alcune funzioni aggiuntive al fine di incrementare le prestazioni.
  • Esokernel, che rimuovono tutte le limitazioni legate all'astrazione dell'hardware e si limitano a garantire l'accesso concorrente allo stesso, permettendo alle singole applicazioni di implementare autonomamente le tradizionali astrazioni del sistema operativo per mezzo di speciali librerie.

Kernel monolitici

[modifica | modifica wikitesto]
Rappresentazione grafica di un kernel monolitico

L'approccio monolitico definisce un'interfaccia virtuale di alto livello sull'hardware e software, con un set di primitive o chiamate di sistema per implementare servizi di sistema operativo come gestione dei processi, multitasking e gestione della memoria, in diversi moduli che girano in modalità supervisore.

Anche se ogni modulo che serve queste operazioni è separato dal resto, l'integrazione del codice è molto stretta e difficile da fare in maniera corretta e, siccome tutti i moduli operano nello stesso spazio, un bug in uno di essi può bloccare l'intero sistema. Tuttavia, quando l'implementazione è completa e sicura, la stretta integrazione interna dei componenti rende un buon kernel monolitico estremamente efficiente.

Il più considerevole svantaggio dei kernel monolitici è tuttavia che non è possibile aggiungere un nuovo dispositivo hardware senza aggiungere il relativo modulo al kernel, operazione che richiede la ricompilazione del kernel. In alternativa è possibile compilare un kernel con tutti i moduli di supporto all'hardware, al costo di aumentarne molto la dimensione. Tuttavia i kernel monolitici più moderni come il kernel Linux e FreeBSD possono caricare moduli in fase di esecuzione, se sono previsti in fase di configurazione (fase che precede quella di compilazione, durante la quale si può scegliere quali feature o driver debbano far parte del nuovo kernel), permettendo così l'estensione del kernel quando richiesto, mantenendo al contempo le dimensioni del codice nello spazio del kernel al minimo indispensabile.

Esempi di kernel monolitici:

Rappresentazione grafica di un microkernel
Logo AIX, sistema operativo, basato su microkernel
BeOS, altro sistema operativo basato su microkernel

L'approccio microkernel consiste nel definire un kernel principale che fornisce esclusivamente un set di primitive o chiamate di sistema per implementare servizi minimali del sistema operativo quali gestione dei