Dispositivi di input-output

I/O programmato con busy waiting: ovvero quando per esempio un dispositivo di I/O richiede un dato dalla memoria, effettua una richiesta del dato (tramite la CPU), la memoria rende disponibile il dato, la CPU è molto più veloce della memoria, quindi elabora la richiesta del dispositivo all'istante, dunque la CPU per rendere disponibile il dato dalla memoria al dispositivo di I/O deve attendere che il dato sia pronto, il che vuol dire che il processore controlla ripetutamente che la memoria abbia reso disponibile il dato.
Con busy waiting intendiamo attesa attiva, ovvero la CPU non è libera durante l'attesa, ma impegnata ad attendere il dato.

I/O controllato dall'interrupt, risolve il problema sopra, ovvero la CPU richiede un dato per conto di un dispositivo di I/O dalla memoria, poi si mette in attesa, durante l'attesa la CPU esegue altre operazioni, quando il dato è pronto la memoria invia un segnale interrupt alla CPU comunicando che il dato è pronto e la CPU può renderlo disponibile al dispositivo di I/O. Gli interrupt vanno sempre dai dispositivi verso la CPU. Gli interrupt interrompono il programma in esecuzione trasferendo il controllo ad un gestore di interrupt, dopo la gestione dell'interrupt, il controllo passa nuovamente al programma ch'era stato interrotto. Oltre agli interrupt ci sono le trap (o eccezioni), viene "raccolta" dal gestore delle trap (una procedura di gestione della richiesta di trap) la cui posizione è fissata in una certa locazione, a cui il programma salta in caso di trap.

I/O in DMA (direct memory access): è una tecnica utilizzata per trasferire dati tra dispositivi di I/O e la memoria principale senza coinvolgere direttamente la CPU. Invece di fare affidamento sulla CPU per gestire ogni singolo trasferimento di dati, il DMA consente al dispositivo di I/O di accedere direttamente alla memoria e trasferire i dati in modo autonomo. Il DMA sfrutta un modulo chiamato DMA controller (o DMA engine) che si trova tra i dispositivi di I/O e la memoria principale per gestire i trasferimenti di dati diretti senza coinvolgere la CPU in modo diretto.

Questi tre, sono tre tipi di istruzioni a livello ISA.

La CPU comunica con i moduli di I/O tramite controllori (controller) che trasformano i comandi della CPU in segnali elettrici per le periferiche e i segnali delle periferiche in dati per la CPU.

Ogni controller ha dei registri identificati da un indirizzo che può appartenere agli insieme degli indirizzi della memoria (memory mapped) oppure no (isolated).

La comunicazione con i controllori è simili agli accessi in memoria.

Funzionamento di questo tipo di interazioni in un processore RISC-V
...

Pasted image 20230618112633.png
SRET è una istruzione speciale che si trova alla fine del gestore dell'eccezione.

Il programma in esecuzione deve essere sospeso e poi riattivato. Il calcolatore salva il punto in cui si è verificata l'eccezione (Program Counter).

Il controllo passa quindi al "Gestore dell'eccezione" che deve rimediare alla situazione, per questo ci sono dei registri speciali in RISC-V: SPEC e SCAUSE il primo è l'indirizzo in cui l'eccezione si è verificata, il secondo è la causa.

Tipi di eccezioni
...

Pasted image 20230618113057.png
Interrupt: eccezione causata da eventi esterni. Asincrona rispetto l'esecuzione del programma.
Errore: eccezione causata da eventi interni: overflow, divisione per zero, ecc. Sincrona rispetto l'esecuzione del programma.
Environment call: eccezione causata da richiesta di un servizio di sistema (stampa messaggio, lettura di un intero). Istruzione: ecall
Environment break: eccezione causata da motivi diagnostici o debugging. Istruzione ebreak.

Il gestore dell'eccezione deve evitare di modificare lo stato dell'applicazione: i contenuti di tutti i registri non devono essere alterati. Il gestore deve essere eseguito in modalità protetta (kernel mode) e devono essere servite una alla volta (per esempio disabilitando le eccezioni, il gestore può farlo e, quando lo ritiene necessario, riabilitarle).

Il gestore dell'eccezione di RISC-V salva i registri che usa (per esempio salvando i registri temporanei nello stack), vengono automaticamente impostati 2 bit che indicano la modalità supervisor (kernel mode, modalità protetta) e le eccezioni disabilitate.
Poi avviene un salto diretto ad un indirizzo specifico che è salvato in un registro speciale (STVEC).
Nella gestione dell'eccezione è opportuno analizzare la causa dell'eccezione:
Pasted image 20230618114132.png

Altro sull'input-output

Memory mapped I/O
I/O può essere memory mapped, nel senso che una porzione degli indirizzi della memoria principale è riservata ai dispositivi di input-output. L'associazione dei dispositivi a tale porzione di memoria avviene all'avvio. La scrittura e la lettura a questi indirizzi è interpretata dai dispositivi I/O che vi sono collegati come comandi. Quando la CPU comunica con tali indirizzi, la memoria principale ignora le operazioni, poiché la CPU si sta riferendo ad indirizzi riservati a dispositivi di input-output. Tali dispositivi ricevono i dati e li interpretano come comandi.

DMA
Quando la CPU vuol trasferire dati dallo spazio riservati per l'utente allo spazio di I/O lo fa da sé, tuttavia vi sono alcune situazioni in cui la CPU sarebbe troppo sovraccaricata, per esempio nel caso dello scambio di informazioni con la rete ethernet. La rete riceve ed invia informazioni di continuo, si rischierebbe che la CPU passi troppo tempo a risolvere le richieste del modulo ethernet piuttosto che degli altri programmi, così gli architetti dei computer si sono inventati il DMA, che abbiamo sopra descritto. Il controller del DMA, DMA engine si trova direttamente all'interno del dispositivo che ha necessità di comunicare direttamente con la memoria. Quando una scheda di rete per esempio deve preparare dei dati, o riceverli invia un segnale di interrupt. Come abbiamo detto, quando viene generato un interrupt, il device di I/O può inviare insieme al segnale un vettore di indirizzi o un campo di stato (status field) piazzato nel registro SCAUSE, in tal modo quando il sistema operativo prende il controllo, conosce l'identità del dispositivo che ha causato l'interrupt e può subito interrogarlo.

Driver
Il software all'interno di un sistema operativo che si interfaccia con uno specifico dispositivo di I/O è chiamato device driver. Quindi un driver è un programma che controlla un dispositivo di I/O che è connesso al computer. Nel caso di una scheda di rete per esempio:

  • il driver prepara un buffer per il pacchetto nella memoria dell'host (computer), copia il pacchetto dallo spazio degli indirizzi dell'utente nel buffer allocato nello spazio degli indirizzi del sistema operativo
  • poi comunica con la scheda di rete descrivendo i dettagli dell'operazione (io descriptor) ad un certo registro della scheda di rete
  • la DMA engine nella scheda copia il pacchetto in uscita dal buffer dell'host nel bus PCIe
  • quando la trasmissione è completa, la DMA engine invia un interrupt al processor per notificare che il pacchetto è stato trasmesso
  • il driver infine dealloca il buffer di trasmissione.

Legge di Moore
Il numero di transistor presenti in un microprocessore raddoppia approssimativamente ogni due anni.