Le trap sono un tipo di processor exception che si verificano in modo sincrono, ovvero come conseguenza diretta dell’esecuzione di un’istruzione del processo. Sono eventi generati dal software stesso e richiedono l’intervento del kernel per eseguire operazioni privilegiate o gestire errori. Tipici esempi sono le system call, con cui un programma richiede servizi del sistema operativo, e le exception, come divisioni per zero o accessi a memoria non autorizzati. In pratica, le trap permettono al kernel di prendere il controllo esattamente nel punto in cui il processo ne ha bisogno, garantendo protezione e correttezza dell’esecuzione.
SYSTEM CALL
Trap volontarie: richiesta esplicita di un servizio del sistema operativo. Sono sincrone e innescate dal software (dal programma utente). Ecco come viene gestita una system call:
1. Programma utente
L’utente chiama nel suo programma (user mode) una funzione API, per svolgere delle istruzioni privilegiate (eseguibili solo in kernel mode):
write(fd, buf, 10);Nell’esempio l’utente vuole scrivere 10 byte su un file o dispositivo (istruzione privilegiata).
2. Funzione API
Quando il programma viene compilato e linkato, la chiamata write() viene collegata alla libreria API del sistema operativo. Questa funzione contiene istruzioni macchina concrete che preparano la system call. L’API prepara parametri, inserisce il numero della syscall e provoca la trap con l’istruzione syscall.
Istruzioni in codice macchina nella funzione API corrispondente a alla chiamata dell’esempio:
mov rax, SYS_write ; numero identificativo della syscall
mov rdi, fd ; primo parametro
mov rsi, buf ; secondo parametro
mov rdx, 10 ; terzo parametro
syscall ; istruzione di trap3. CPU legge la trap
Quando la CPU esegue l’istruzione syscall:
- Riconosce una trap software sincrona.
- Salva il contesto del processo (registri, program counter).
- Passa da user mode → kernel mode.
- Determina il numero della trap (tipo trap: system call).
4. Interrupt Vector Table (IVT)
La IVT è una tabella in memoria kernel che associa ogni tipo di trap a una specifica routine kernel per quel tipo di trap.
trap syscall → System Call HandlerNel nostro esempio la CPU prende il tipo di trap (syscall) come indice nella tabella e legge l’indirizzo del System Call Handler (routine kernel valida per tutte le system call).
5. System Call Handler
Il System Call Handler è una routine kernel che gestisce tutte le system call:
- Legge il numero della system call che l’API ha messo in
rax(ad esempioSYS_write). - Consulta la System Call Table per trovare la funzione kernel corrispondente (
sys_write). - Chiama la funzione kernel.
6. System Call Table
La System Call Table è una tabella interna al kernel utilizzata dal System Call Handler per mappare il numero della system call chiamata alla rispettiva funzione kernel di gestione:
0 → sys_read
1 → sys_write
2 → sys_open
...Nel nostro esempio, la CPU/handler legge il numero della syscall (1 per write) e trova il puntatore a sys_write(funzione kernel corrispondente).
7. Funzione kernel
Ora la funzione kernel (sys_write) esegue il servizio reale (azioni privilegiate).
Nel nostro caso:
- scrive 10 byte sul file o dispositivo
- aggiorna strutture dati del kernel (buffer, file descriptor table)
- gestisce permessi, sincronizzazione, driver hardware.
8. Ritorno in user mode
Quando sys_write termina:
- Il System Call Handler finisce.
- La CPU ripristina il contesto salvato prima della trap (registri, PC).
- La CPU torna in user mode, riprendendo l’esecuzione subito dopo la chiamata
write(). - Il valore di ritorno della syscall (numero di byte scritti) viene passato all’API e quindi al programma utente.
EXCEPTION
Trap involontarie: gestione di errori o condizioni anomale (es. divisione per zero, accesso a memoria non valida). Sono sincrone e innescate dal software come conseguenza dell’istruzione eseguita.