Le Unità di I/O e le periferiche

// obiettivi di apprendimento
Comprendere il ruolo dell’unità di I/O come ponte tra sistema di elaborazione e ambiente esterno
Distinguere tra periferiche di input, output e memorizzazione
Spiegare il funzionamento delle interfacce di I/O: registri, buffer e indirizzamento
Conoscere le tre modalità di comunicazione I/O: polling, interrupt e DMA
Differenziare tra I/O memory-mapped e I/O isolato, comprendendo i vantaggi di ciascun approccio
📄
Slides
I/O e periferiche

L’unità di I/O — il confine tra CPU e mondo esterno

CPU e memoria centrale, da sole, non possono fare nulla di utile: hanno bisogno di ricevere dati dall’esterno e di restituire risultati. L’unità di Input/Output è il sottosistema che rende possibile questa comunicazione — è il confine fisico e logico tra il sistema di elaborazione e l’ambiente esterno.

// le quattro funzioni fondamentali dell’I/O
Traduzione dei segnali — converte il formato della periferica nel formato del bus di sistema e viceversa
Sincronizzazione delle velocità — la CPU opera a GHz, una tastiera a pochi byte/secondo; l’I/O colma il divario
Gestione dei trasferimenti — coordina quando e come i dati si spostano tra periferica, bus e memoria
Indirizzamento delle periferiche — ogni dispositivo ha un indirizzo logico unico per essere identificato dalla CPU

Senza il sottosistema di I/O, la CPU non saprebbe come parlare con una tastiera, un disco o una scheda di rete — dispositivi con velocità, protocolli e formati completamente diversi tra loro e dal bus di sistema.

Le interfacce di I/O — il modulo intermedio

Non è possibile collegare una periferica direttamente al bus di sistema: le differenze di velocità, formato dei segnali e protocollo lo impediscono. Serve sempre un modulo intermedio: l’interfaccia di I/O (o controller di I/O).

REGISTRO DATI
Contiene il dato in transito tra periferica e CPU — il byte appena letto dalla tastiera o il pixel da inviare al monitor
REGISTRO DI STATO
Indica la condizione attuale della periferica — occupata, pronta, errore. La CPU lo interroga per sapere se può procedere
REGISTRO DI CONTROLLO
Riceve comandi dalla CPU — avvia trasferimento, imposta velocità, attiva/disattiva interrupt

Il buffer — soluzione al dislivello di velocità

Il problema più critico nell’I/O è il dislivello di velocità tra CPU e periferiche. La CPU opera a miliardi di cicli al secondo; una tastiera produce forse 10 caratteri al secondo. Senza un meccanismo di compensazione, la CPU dovrebbe aspettare la periferica — sprecando cicli preziosi.

// senza buffer
CPU invia un byte alla stampante → attende che la stampa finisca → invia il byte successivo. La CPU è bloccata per tutta la durata della stampa.
// con buffer
La CPU scarica l’intero documento nel buffer dell’interfaccia — poi è libera. Il controller invia i byte alla stampante al suo ritmo, in autonomia.

Indirizzamento delle periferiche

Ogni periferica deve avere un indirizzo univoco che la CPU può usare per comunicare con essa. Esistono due approcci architetturali distinti:

I/O MEMORY-MAPPED
Indirizzi condivisi con la RAM
Le periferiche occupano porzioni dello spazio di indirizzamento della memoria. La CPU accede ai registri delle periferiche con le stesse istruzioni usate per la RAM (MOV, LOAD, STORE).
Istruzioni standard — nessun set speciale
Modalità di indirizzamento complete
Riduce lo spazio disponibile per la RAM
Usato in: ARM, RISC-V, la maggior parte degli MCU
I/O ISOLATO (PORT-MAPPED)
Spazio di indirizzamento separato
Le periferiche hanno uno spazio di indirizzi dedicato, separato dalla RAM. La CPU usa istruzioni specifiche per accedervi: IN per leggere da una porta, OUT per scrivere.
Spazio RAM non intaccato
Separazione netta tra RAM e I/O
Richiede istruzioni dedicate (IN/OUT)
Usato in: architettura x86 (Intel/AMD)
; x86 — I/O isolato (port-mapped)
IN  AL, 60h    ; legge un byte dalla porta 0x60 (tastiera)
OUT 61h, AL    ; scrive un byte sulla porta 0x61 (speaker)

; ARM — I/O memory-mapped
LDR R0, =0x40021000  ; indirizzo registro GPIO
STR R1, [R0]         ; scrive sul registro — come fosse RAM

Modalità di comunicazione I/O

Esistono tre approcci fondamentali con cui la CPU gestisce la comunicazione con le periferiche. Differiscono per efficienza, complessità hardware e impatto sulla CPU.

Modalità 1 — I/O Programmato (Polling)

La CPU interroga periodicamente la periferica verificando il registro di stato: “sei pronta?” Se il dato non è ancora disponibile, la CPU riprova al ciclo successivo — finché non ottiene risposta positiva.

; esempio polling — attesa tastiera
poll_loop:
  IN   AL, STATUS_PORT  ; leggi stato
  TEST AL, 01h          ; bit "dato pronto"?
  JZ   poll_loop        ; no → riprova
  IN   AL, DATA_PORT    ; sì → leggi dato
// vantaggi
Semplicissimo da implementare — nessun hardware aggiuntivo richiesto
// svantaggi
La CPU spreca cicli in attesa — non può fare altro durante il polling. Inefficiente con periferiche lente.

Modalità 2 — I/O con Interrupt

La periferica lavora in autonomia. Quando è pronta, invia un segnale di interruzione (INT) alla CPU. La CPU sospende il programma corrente, salva il contesto nello stack, esegue la routine di gestione dell’interrupt (ISR — Interrupt Service Routine), poi riprende esattamente dove si era fermata.

01
CPU esegue il programma principale
La CPU lavora normalmente — non perde tempo in polling. La periferica opera in parallelo.
02
Periferica → INT attivo
La periferica è pronta: attiva il segnale INT sul bus di controllo.
03
CPU salva il contesto nello stack
Il valore del PC e dei registri vengono salvati nello stack — il programma corrente viene “congelato”.
04
CPU esegue la ISR
La CPU salta all’Interrupt Service Routine — legge il dato dalla periferica e lo elabora.
05
CPU ripristina il contesto — RETI
L’istruzione RETI recupera dallo stack il vecchio PC — il programma principale riprende esattamente dove era stato interrotto.
// interrupt vettorizzati
Nei sistemi moderni ogni sorgente di interrupt ha un numero identificativo. Quando la CPU riceve un interrupt, consulta la tabella dei vettori di interrupt (IVT/IDT) per trovare l’indirizzo della ISR corrispondente — permettendo a molte periferiche diverse di coesistere con gestori dedicati.

Modalità 3 — DMA (Direct Memory Access)

Per trasferimenti di grandi quantità di dati — un file da disco, un frame video, un pacchetto di rete — gestire ogni byte via CPU (anche con interrupt) sarebbe ancora troppo costoso. Il DMA risolve il problema: un controller hardware dedicato trasferisce i dati direttamente tra periferica e RAM, senza coinvolgere la CPU byte per byte.

01
CPU programma il controller DMA
La CPU configura il DMA: indirizzo sorgente, indirizzo destinazione in RAM, numero di byte da trasferire.
02
DMA richiede il controllo del bus — CPU cede
Il DMA usa il meccanismo di bus request/grant per prendere il controllo del bus di sistema. La CPU viene temporaneamente disconnessa.
03
DMA trasferisce — periferica → RAM
Il controller DMA gestisce autonomamente l’intero trasferimento. La CPU può continuare ad eseguire istruzioni dalla cache interna (cycle stealing).
04
DMA → INT alla CPU: trasferimento completato
Al termine del blocco, il DMA invia un singolo interrupt alla CPU — che ora può elaborare i dati già presenti in RAM.

Confronto tra le tre modalità

CaratteristicaPollingInterruptDMA
Coinvolgimento CPUContinuo — aspetta attivamenteIntermittente — gestisce la ISRMinimo — solo setup e fine
Efficienza CPUBassa — cicli sprecatiMedia — dipende dalla frequenzaAlta — CPU libera durante il trasf.
Complessità hardwareMinimaMedia — serve controller interruptAlta — richiede controller DMA
Volume dati gestitoByte singoliByte / piccoli blocchiGrandi blocchi (KB–MB)
Latenza rispostaDipende dal ciclo di pollBassa — reazione immediataBassa per il blocco, alta per il primo byte
Applicazioni tipicheMCU semplici, sensori lentiTastiera, mouse, timerDisco, GPU, scheda di rete, audio

Classificazione delle periferiche

Le periferiche si classificano in tre categorie in base alla direzione del flusso di dati rispetto alla CPU.

📥 INPUT
Periferica → CPU
Tastiera — testo e comandi
Mouse / touchpad — posizione
Scanner — immagini digitali
Microfono — audio analogico→digitale
Sensori (temperatura, pressione…)
Webcam — flusso video
📤 OUTPUT
CPU → Periferica
Monitor — segnale video
Stampante — documento fisico
Altoparlanti — audio digitale→analogico
Proiettore — segnale display
Attuatori — motori, relay, LED
💾 MEMORIZZAZIONE
Bidirezionale — persistente
HDD — dischi magnetici rotanti
SSD — memoria Flash NVMe/SATA
Chiavetta USB — Flash portatile
Scheda SD — embedded e fotocamere
Nastro magnetico — backup archivio

Periferiche interne vs esterne

// periferiche interne
Collegate tramite bus interni — PCIe, SATA, M.2. Massima velocità di trasferimento, nessun overhead di protocollo esterno. Es: SSD NVMe, GPU dedicata, scheda Wi-Fi interna.
// periferiche esterne
Connesse tramite porte standard — USB, HDMI, Thunderbolt, Ethernet. Universali e hot-plug, velocità variabile. Es: chiavette, monitor, stampanti, hub di rete.

Riepilogo

  • L’unità di I/O è il sottosistema che connette CPU e memoria all’ambiente esterno — gestisce traduzione, sincronizzazione, trasferimento e indirizzamento delle periferiche
  • Le interfacce di I/O (controller) sono necessarie perché le periferiche non possono connettersi direttamente al bus — sono troppo lente e usano formati incompatibili
  • Ogni interfaccia espone tre registri: dato (il contenuto in transito), stato (è pronta?) e controllo (comandi dalla CPU)
  • Il buffer dell’interfaccia compensa il dislivello di velocità tra CPU e periferica — la CPU scarica i dati nel buffer e torna libera
  • Nell’I/O memory-mapped le periferiche occupano indirizzi nello spazio RAM — si accede con istruzioni standard. Nell’I/O isolato (x86) le periferiche hanno spazio dedicato — si usano IN/OUT
  • Il polling è semplice ma spreca cicli CPU in attesa attiva
  • Gli interrupt lasciano la CPU libera — la periferica la chiama solo quando è pronta; la CPU salva il contesto, esegue la ISR e riprende
  • Il DMA trasferisce grandi blocchi direttamente tra periferica e RAM, con un solo interrupt finale — ideale per disco, GPU e rete
  • Le periferiche si classificano in input (tastiera, sensori), output (monitor, attuatori) e memorizzazione (SSD, HDD)

Lascia un commento