I processori mettono a disposizione alcune modalità di protezione per evitare accessi non autorizzati alle risorse.
Nelle prime CPU x86 era stata implementata una sola modalità d’esecuzione conosciuta come REAL MODE che non consentiva di limitare le risorse ad un processo, mentre i processori x86 più recenti (senza estensioni per la virtualizzazione) hanno un gruppo di istruzioni più esteso che comprende anche funzioni di protezione avanzate:

  • REAL MODE: ogni processo ha completo accesso a tutto l’hardware (mantenuto per esigenze di backward compatibility)
  • PROTECTED MODE: Sono creati dei livelli di protezione, detti anelli (RING), che servono per differenziare i permessi di utilizzo delle risorse.

In real mode tutti i processi possono operare liberamente nella memoria ed accedere a qualsiasi risorsa; usando questa modalità non è possibile ad esempio gestire il multitasking a livello hardware.

In protected mode, vi sono degli anelli che sono dei meccanismi i quali permettono al sistema operativo, tramite il processore, di limitare l’operatività dei programmi utente.
Sono definiti quattro livelli di protezione numerati da zero (anello di maggior privilegio) a tre (minor privilegio).
Questi quattro ring hanno lo scopo di restringere principalmente l’accesso a due risorse: la memoria e le porte I/O, inoltre regolano la capacità di portare a termine con successo alcune istruzioni.
Poco più di una dozzina di istruzioni possono essere svolte solamente con privilegi di livello zero, qualora si tentasse l’esecuzione di una di queste con privilegi insufficienti viene generata un’eccezione, che deve essere gestita dal sistema operativo.[ad#midarticlequadr]
Il primo anello (RING 0) è detto “kernel mode” o “supervisor mode”, mentre l’ultimo anello (RING 3) che viene usato per i processi utente (user space) è chiamato “user mode”.
I più recenti sistemi fanno uso del primo e dell’ultimo anello, lasciando inutilizzati il secondo ed il terzo.
Generalmente i kernel dei sistemi operativi (i loro servizi e librerie) adoperano l’anello zero che consente loro di svolgere tutte le istruzioni privilegiate quali la gestione della memoria (ad esempio operare direttamente sull’intero intervallo degli indirizzi di memoria o accedere alle tabelle delle pagine del processore), l’input/output su disco e controllare i registri dei segmenti.

Paravirtualizzazione e livelli di protezione

Toshiba 4TB Canvio Basics Portable External Hard Drive,USB 3.2. Gen 1, Black (HDTB440EK3AA)

Seguendo l’approccio della paravirtualizzazione, il sistema operativo guest deve essere modificato per poter interagire con l’hypervisor ed è quest’ultimo che gestisce l’accesso alle risorse fisiche. Quando un’applicazione, in esecuzione su una normale distribuzione Linux, invoca una SYSTEM CALL, questa viene gestita dal kernel che opera nell’anello 0.

In una ambiente paravirtualizzato il kernel dell’ambiente virtualizzato non è in grado di eseguire operazioni privilegiate, ma un’eventuale SYSTEM CALL deve essere intercettata dall’hypervisor e da questo notificata al kernel del guest. Il kernel guest modificato interpreta in modo opportuno la system call notificata e invia all’hypervisor una specifica hypercall (vedi figura sottostante).

Una hypercall è una interruzione software (software trap) che viene usata dalle applicazioni per richiedere lo svolgimento di operazioni privilegiate. Questa interruzione funziona similmente a una system call ma usa un istruzione assembly differente (0x82 invece di 0x80) ed è progettata per passare il controllo dal ring 1 (dove sta il kernel del guest) al ring 0.
Questo meccanismo introduce certamente dell’elaborazione extra, ma consente a tutte le applicazioni di funzionare senza essere modificate (in questo caso solo il kernel guest è modificato).

Per ridurre l’overhead è possibile ricorrere a chiamate dette Accellerated System call; in questo caso le librerie del sistema guest sono modificate per usare una system call indirizzata al kernel guest in ring 1 invece che una system call diretta al ring 0 (dove si trova l’hypervisor). In tal modo l’hypervisor non deve notificare il kernel guest per ogni system call.

Di valent

1 commento su “Livelli di protezione x86”

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *