Introduzione

Con il passare degli anni i computer sono diventati sistemi sempre più complessi: software sofisticati, molte periferiche, più livelli di astrazione. Per gestire tutto ciò, il software di un calcolatore si divide in due grandi famiglie: programmi di sistema (che controllano il funzionamento del calcolatore) e programmi applicativi (videoscrittura, fogli di calcolo, browser, giochi, strumenti multimediali, ecc.).

Tra i programmi di sistema, il ruolo centrale è svolto dal sistema operativo (SO), che fa da intermediario tra utente e hardware: governa le risorse, offre un ambiente in cui eseguire le applicazioni e nasconde gran parte della complessità dei dispositivi sottostanti.

Perché serve un sistema operativo

Un calcolatore moderno (CPU, RAM, dischi, tastiera, mouse, schermo, stampante, schede audio/video/rete, e molte altre periferiche) espone dettagli operativi molto diversi tra piattaforme. Se ogni programmatore dovesse parlare direttamente con ciascun dispositivo, i programmi sarebbero fragili e poco portabili. Il SO fornisce un’interfaccia unica e stabile a monte di hardware differenti: traduce le richieste delle applicazioni nei comandi specifici di ciascuna macchina.

Architettura a livelli

È utile pensare il sistema come strati che dialogano solo con i livelli adiacenti:

Architettura del sistema: livelli e interfacce
Hardware Programmi di sistema Programmi applicativi
Linguaggio macchina Utilità di sistema Gestione ufficio
Dispositivi fisici Sistema operativo Giochi e applicazioni varie

Notare che il linguaggio macchina, pur essendo software, è strettamente legato all’hardware: ogni famiglia di CPU ha il proprio set d’istruzioni. Senza un SO, i programmi dovrebbero esistere in tante varianti quante sono le piattaforme.

Avvio del sistema (boot)

All’accensione, sulle architetture x86 classiche, la CPU carica dalla ROM il firmware della scheda madre (BIOS). Il BIOS esegue il POST (Power On Self Test), rileva memoria e periferiche e, al termine, legge dall’hard disk il Master Boot Record (MBR): in quei 512 byte è presente il codice del boot loader, che avvia il SO. Con un solo SO l’avvio è diretto; in presenza di più sistemi, un boot loader adeguato presenta un menu di scelta. Storicamente (es. Windows 9x) il comando FDISK /MBR riscriveva il loader MBR; oggi il panorama include anche altre soluzioni.

Mostra approfondimento
Comprimi approfondimento

Approfondimento: dall’accensione al controllo del kernel

Alla pressione del tasto di accensione la CPU x86 entra nello stato di reset e parte dal suo reset vector in real mode 16-bit. Qui trova il firmware della scheda madre — storicamente il BIOS in ROM — il primo software che esegue.

Il BIOS avvia il POST: verifica la RAM, inizializza la grafica testuale per i messaggi, sonda bus e periferiche (PCI; in passato anche ISA), legge eventuali Option ROM e definisce l’ordine di avvio. In questa fase costruisce anche una mappa della memoria (aree utilizzabili, regioni riservate, tabelle ACPI, ecc.).

Completati i test cerca un dispositivo avviabile. Nel caso classico MBR su disco, legge il primo settore (512 byte, LBA0): il Master Boot Record, che contiene un mini-programma e la tabella primaria delle partizioni (più la firma 0x55AA). Se la firma è valida, quel codice viene eseguito.

Il MBR individua la partizione attiva e ne carica il Volume Boot Record (VBR). Il VBR conosce il proprio file system (FAT/NTFS, ecc.) e carica un boot loader più ricco. Nei DOS/Windows storici il VBR porta a componenti come IO.SYS/MSDOS.SYS, poi NTLDR e quindi BOOTMGR; nei sistemi Unix-like è comune un loader a stadi (es. GRUB): uno stadio minimo, uno intermedio che sa leggere il file system e uno principale con menu e moduli (multiboot via chain-loading).

Il boot loader compie tre azioni chiave: (1) carica in RAM il kernel e, se previsto, un’initrd/initramfs; (2) passa al kernel un blocco di parametri (mappa memoria, ACPI/SMBIOS, riga di comando, initrd); (3) gestisce la transizione di modalità: abilita la linea A20, prepara GDT/IDT, entra in protected mode 32-bit e poi in long mode 64-bit sulle CPU a 64 bit.

Il kernel prende quindi il controllo: si decomprime, inizializza memoria virtuale e paginazione, imposta interrupt/timer, rileva i core (SMP) e carica i driver indispensabili. Se c’è un initrd, lo monta come root temporanea per caricare moduli e poi monta il file system di root permanente; infine passa al primo processo utente (PID 1: init/systemd nei Unix-like; nei Windows moderni il Session Manager che avvia servizi e interfaccia utente).

Dopo il kernel: i sottosistemi in attività

Processi (stati, context switch), memoria (paging, cache), file system (VFS, permessi/ACL, journaling), I/O (driver, DMA, interrupt, Plug&Play, ACPI), sicurezza (isolamento ring 0/3, policy), interfaccia utente (shell o GUI).

Nota moderna (UEFI/GPT) — sui PC attuali il BIOS è spesso sostituito da UEFI, che carica eseguibili EFI da una ESP su dischi GPT. La catena resta: firmware → loader → kernel, ma senza i limiti storici dell’MBR; il multiboot può essere gestito dal boot manager UEFI o da GRUB in modalità EFI.

Componenti fondamentali di un SO

  1. Gestione dei processi: creazione, scheduling, sincronizzazione e terminazione dei processi.
  2. Gestione della memoria principale: allocazione, protezione, memoria virtuale.
  3. Gestione della memoria secondaria: organizzazione e accesso efficiente a dischi e SSD.
  4. File system: struttura logica dei file, directory, permessi, caching.
  5. Dispositivi di I/O: driver, bufferizzazione, code e policy di accesso.
  6. Protezione: isolamento e controllo degli accessi alle risorse.
  7. Interprete dei comandi: shell/testuale o interfaccia grafica.

Processo vs Programma

Un programma è un’entità passiva (file binario che può restare su disco all’infinito). Un processo è un’entità attiva: l’istanza in esecuzione di un programma, con il suo codice, i dati e le strutture di sistema (stato CPU, descrittori, risorse allocate).

Funzioni chiave del sistema operativo

1) Gestione delle risorse hardware

Riconoscimento della configurazione (Plug&Play dove possibile), risoluzione dei conflitti, assegnazione “intelligente” di CPU, memoria e I/O ai processi.

2) File system

Organizza dati e programmi, gestisce caricamento/esecuzione dei binari, integrità dei supporti, ottimizzazioni di caching e prefetch.

3) Interfaccia con l’utente

Nei sistemi professionali può essere una shell testuale; nei sistemi desktop, un’interfaccia grafica a finestre con puntatore, icone e menù. In entrambi i casi: un linguaggio di comando/azione coerente e prevedibile.

Il Kernel

Il kernel è il nucleo del SO. Definisce l’architettura di base del sistema, rende possibile il multitasking e dialoga direttamente con la CPU. Su x86 inizializza tabelle e registri speciali; gestisce la memoria virtuale (spazi di indirizzamento ampi e isolati per ogni processo) e la protezione (un processo non può corrompere la memoria di un altro). Molti sistemi estendono il kernel con moduli/driver: componenti privilegiati che aggiungono funzionalità (es. networking TCP/IP) o supporto a nuovi dispositivi.

BIOS e bootstrap

Il BIOS è un insieme di routine in ROM che inizializzano l’hardware, svolgono diagnostica e preparano l’avvio (bootstrap):

  1. inizializzazione del disco per l’accesso a basso livello;
  2. preparazione della memoria dove verranno caricati i componenti del SO;
  3. caricamento del loader, che a sua volta carica il kernel e trasferisce a esso il controllo.

Quiz (scelta multipla)

1) Con il termine “processo” si indica:

  • a) un elemento che gestisce l’interfaccia utente
  • b) l’istanza di un programma in esecuzione
  • c) la gestione delle periferiche
  • d) il software per la stampa dei documenti
Mostra soluzione
Nascondi soluzione
Risposta corretta: b — un processo è l’istanza attiva di un programma: codice, dati, stato e risorse.

2) Con il termine BIOS si intende:

  • a) il cuore del sistema operativo
  • b) un insieme di istruzioni in ROM
  • c) il kernel del sistema operativo
  • d) un protocollo per Internet
Mostra soluzione
Nascondi soluzione
Risposta corretta: b — firmware in ROM che inizializza l’hardware e avvia il bootstrap.

3) Il kernel rappresenta:

  • a) l’interfaccia utente
  • b) il motore di ricerca interno
  • c) una porzione di memoria per le applicazioni
  • d) il nucleo del sistema operativo
Mostra soluzione
Nascondi soluzione
Risposta corretta: d — gestisce CPU, memoria, I/O, protezione e processi.