Moduli di input-output e input-output programmato
In questa pagina 5
In questa pagina 4
Perché un modulo di I/O
Le periferiche sono molto diverse tra loro (formati, velocità da pochi byte/s per una tastiera a GB/s per un SSD) e quasi tutte più lente della CPU. Collegarle direttamente al bus sarebbe impossibile: il modulo di I/O (controllore, interfaccia) fa da tramite tra il bus di sistema e uno o più dispositivi.
Funzioni:
- controllo e temporizzazione del flusso di dati;
- comunicazione con la CPU: decodifica dei comandi, scambio di dati, segnalazione dello stato, riconoscimento del proprio indirizzo;
- comunicazione con il dispositivo: comandi, stato, dati;
- buffer: assorbe la differenza di velocità;
- rilevazione degli errori (meccanici, di trasmissione).
Il dispositivo esegue la trasduzione: converte tra dati binari e grandezze fisiche (movimento, luce, suono, magnetizzazione).
Il modulo presenta alla CPU dei registri: di dati, di stato (es. bit "pronto", bit "errore") e di controllo (comandi).
Indirizzamento dei dispositivi
| I/O mappato in memoria | I/O isolato | |
|---|---|---|
| spazio di indirizzi | unico: i registri dei moduli occupano indirizzi di memoria | separato per l'I/O |
| istruzioni | le stesse load/store della memoria | istruzioni dedicate (IN, OUT in x86) |
| pro | nessuna istruzione speciale; tutte le modalità di indirizzamento disponibili | lo spazio di memoria resta tutto per la memoria |
| contro | consuma indirizzi di memoria | insieme di istruzioni di I/O limitato |
ARM usa I/O mappato in memoria. Esempio: il registro di stato di una UART a 0x101F1018, bit 5 = "buffer di trasmissione pieno", registro dati a 0x101F1000.
I/O programmato
La CPU esegue tutto: dà il comando, poi interroga ripetutamente il registro di stato (polling) finché il dispositivo è pronto, poi trasferisce il dato.
LDR r1, =0x101F1000 @ base della UART
attesa: LDR r2, [r1, #0x18] @ legge il registro di stato
TST r2, #0x20 @ bit 5: buffer pieno?
BNE attesa @ sì: aspetta (attesa attiva)
STRB r0, [r1] @ no: scrive il carattere nel registro datiProblema: attesa attiva. Se la CPU esegue istruzioni al secondo e una stampante accetta 1000 caratteri al secondo, per ogni carattere la CPU spreca circa un milione di istruzioni a controllare lo stato.
Le tre tecniche
| Trasferimento dati | Chi aspetta | |
|---|---|---|
| I/O programmato | CPU | la CPU, in attesa attiva |
| I/O con interrupt (vedi InterruptClassi di interruzioni; I/O guidato da interrupt; sequenza hardware e software di gestione con salvataggio del contesto sullo stack; identificazione della sorgente (linee multiple, polling, daisy chain, vettore); priorità e interruzioni annidate; eccezioni e modi in ARM.Interrupt →) | CPU | nessuno: il modulo avvisa la CPU quando è pronto |
| DMA (vedi Accesso diretto alla memoria (DMA)Modulo DMA e informazioni che riceve dalla CPU; trasferimento a blocco con un solo interrupt finale; furto di cicli e modalità a burst, punti in cui la CPU può essere sospesa; configurazioni del bus; canali e processori di I/O; confronto quantitativo con l'I/O a interrupt.Accesso diretto alla memoria (DMA) →) | modulo DMA, direttamente con la memoria | nessuno: la CPU è avvisata solo alla fine del blocco |
Errori tipici
- Pensare che con l'I/O mappato in memoria i dati passino per la cache: i registri dei dispositivi vanno marcati come non cacheable, altrimenti la CPU leggerebbe valori vecchi.
- Confondere I/O isolato (spazio di indirizzi separato) con "periferica non collegata al bus".
Versione ripasso
Modulo di I/O
Le periferiche sono eterogenee e lente; il modulo di I/O sta tra bus e dispositivi: controllo e temporizzazione, comunicazione con CPU e dispositivo, buffer, rilevazione degli errori. Il dispositivo fa la trasduzione. La CPU vede registri di dati, di stato (pronto, errore) e di controllo.
Indirizzamento
- Mappato in memoria: spazio unico, stesse load/store, modalità complete, ma consuma indirizzi di memoria. ARM lo usa: UART con stato a
0x101F1018(bit 5 = buffer pieno) e dati a0x101F1000. - Isolato: spazio separato, istruzioni dedicate (
IN,OUTin x86), insieme di istruzioni di I/O limitato.
I/O programmato
Comando, poi polling del registro di stato finché il dispositivo è pronto, poi trasferimento:
LDR r1,=0x101F1000; attesa: LDR r2,[r1,#0x18]; TST r2,#0x20; BNE attesa; STRB r0,[r1].
Attesa attiva: con istruzioni/s e una stampante da 1000 caratteri/s si sprecano circa un milione di istruzioni per carattere.
Le tre tecniche
- Programmato: trasferisce la CPU, che aspetta.
- Interrupt (InterruptClassi di interruzioni; I/O guidato da interrupt; sequenza hardware e software di gestione con salvataggio del contesto sullo stack; identificazione della sorgente (linee multiple, polling, daisy chain, vettore); priorità e interruzioni annidate; eccezioni e modi in ARM.Interrupt →): trasferisce la CPU, il modulo la avvisa.
- DMA (Accesso diretto alla memoria (DMA)Modulo DMA e informazioni che riceve dalla CPU; trasferimento a blocco con un solo interrupt finale; furto di cicli e modalità a burst, punti in cui la CPU può essere sospesa; configurazioni del bus; canali e processori di I/O; confronto quantitativo con l'I/O a interrupt.Accesso diretto alla memoria (DMA) →): trasferisce il modulo con la memoria, avviso solo a fine blocco.
Errori tipici: i registri dei dispositivi vanno non cacheable (altrimenti valori vecchi); I/O isolato non significa periferica fuori dal bus.