IL SISTEMA DI I/O - Quelli di Informatica
IL SISTEMA DI I/O - Quelli di Informatica
IL SISTEMA DI I/O - Quelli di Informatica
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>IL</strong> <strong>SISTEMA</strong> <strong>DI</strong> I/O<br />
L’INTERFACCIA <strong>DI</strong> I/O<br />
Come tutte le operazioni complesse quelle <strong>di</strong> I/O sono stu<strong>di</strong>ate e progettate a <strong>di</strong>versi livelli o strati<br />
procedendo dal livello più elementare al più complesso, risolvendo sia problemi relativi ai dettagli elettronico-circuitali,<br />
sia quelli <strong>di</strong> organizzazione del sistema. È detta interfaccia <strong>di</strong> I/O, l’apparecchiatura che si interpone tra periferia e<br />
processore, il processore la vede come oggetto da e verso il quale si effettua l’I/O e nei suoi riguar<strong>di</strong>; l’interfaccia si<br />
presenta con una determinata architettura, sud<strong>di</strong>visa in sezione <strong>di</strong> ingresso, sezione <strong>di</strong> uscita con uno o più<br />
registri verso i quali il processore invia i suoi messaggi.<br />
ARCHITETTURA <strong>DI</strong> I/O<br />
L’architettura della sezione <strong>di</strong> I/O <strong>di</strong> un processore ha l’onere <strong>di</strong> definire:<br />
• numero e tipo <strong>di</strong> segnali;<br />
• linee <strong>di</strong> collegamento tra CPU ed interfaccia;<br />
• organizzazione;<br />
• struttura, <strong>di</strong>pendente dalla restante architettura del sistema e dal tipo <strong>di</strong> interfaccia.<br />
Tutte le istruzioni in linguaggio macchina sono eseguite me<strong>di</strong>ante operazioni elementari, dette<br />
microoperazioni, definite dall’architettura <strong>di</strong> macchina. L’architettura <strong>di</strong> I/O definisce dunque le microoperazioni con<br />
le quali si compongono le istruzioni <strong>di</strong> I/O, che tipicamente consistono nello spostamento <strong>di</strong> un dato verso un registro<br />
dell’interfaccia oppure nello spostamento <strong>di</strong> un bit <strong>di</strong> controllo o nell’interrogazione del suo stato.<br />
DRIVER E PROTOCOLLO<br />
Per la costruzione <strong>di</strong> programmi, che portino alla realizzazione <strong>di</strong> un’azione <strong>di</strong> I/O, il processore mette a<br />
<strong>di</strong>sposizione dei co<strong>di</strong>ci operativi, specificamente de<strong>di</strong>cati a questo genere <strong>di</strong> operazioni. Un’istruzione del linguaggio<br />
macchina mantiene sempre un contenuto operativo molto elementare, realizzabile, tipicamente, con un’unica o poche<br />
microoperazioni ed è sempre molto <strong>di</strong>stante da quella che è un’operazione <strong>di</strong> I/O vera e propria, così come vista a<br />
livello applicativo.<br />
Tuttavia a causa della ridotta potenza operativa delle istruzioni in linguaggio macchina, rispetto alle azioni <strong>di</strong><br />
I/O è necessario l’utilizzo <strong>di</strong> un software capace <strong>di</strong> guidare le periferiche. Il livello più elementare <strong>di</strong> tale software è<br />
costituito dal cosiddetto driver, che effettua il trasferimento <strong>di</strong> un messaggio completo dalla periferia ad un buffer <strong>di</strong><br />
memoria o viceversa.<br />
Lo scambio <strong>di</strong> messaggi tra due apparecchiature prende il nome generico <strong>di</strong> colloquio, l’insieme delle regole<br />
atte a <strong>di</strong>sciplinare un corretto colloquio tra due apparecchiature è detto protocollo. Tipicamente i protocolli non sono<br />
tutti uguali, variano infatti da periferica a periferica e a seconda dei bus <strong>di</strong> collegamento.<br />
MESSAGGI SCAMBIATI<br />
Un’operazione <strong>di</strong> uscita consiste nell’invio alla periferia da parte della CPU <strong>di</strong> un insieme <strong>di</strong> messaggi, tali che<br />
un blocco <strong>di</strong> dati sia trasferito dalla memoria ad una specifica zona periferica. Dualmente un’operazione <strong>di</strong> ingresso<br />
produce lo spostamento del blocco <strong>di</strong> dati da un blocco periferico alla memoria.<br />
Tra CPU e periferia vengono quin<strong>di</strong> interscambiati dati in ambo le <strong>di</strong>rezioni, tuttavia oltre ai dati fluiscono<br />
anche altri messaggi, dal momento che è sempre la CPU ad eseguire l’operazione <strong>di</strong> I/O. Il processore invia coman<strong>di</strong><br />
alla periferia per in<strong>di</strong>care le operazioni da compiere e quest’ultima risponde con stati, vale a <strong>di</strong>re con in<strong>di</strong>cazioni che<br />
sintetizzano ed informano le con<strong>di</strong>zioni <strong>di</strong> funzionamento della periferica e circa gli eventi accaduti. In generale l’ente<br />
che manda messaggi <strong>di</strong> tipo comando è tipicamente chiamato master, viceversa l’ente che esegue il comando e invia<br />
informazioni circa sul suo stato, assume il nome <strong>di</strong> slave. Assumiamo, dunque, un modello secondo il quale i messaggi<br />
scambiati tra CPU (master) e periferia (slave) sono così composti:<br />
• messaggi in input: dato, stato;<br />
• messaggi in output: dato, comando.<br />
master<br />
dato-comando<br />
OUTPUT<br />
dato-stato<br />
INPUT<br />
slave<br />
Il sistema centrale e la periferia sono tra loro collegati tramite opportuni bus, aventi parallelismo <strong>di</strong> 1 bit, 1<br />
byte o 1 parola-macchina, mentre i messaggi, che devono essere scambiati possono avere la medesima <strong>di</strong>mensione <strong>di</strong><br />
bit o anche <strong>di</strong> più ampio blocco. Un messaggio elementare ha il parallelismo pari ad 1 byte od 1 parola del<br />
processore.
LE FASI DEL COLLOQUIO<br />
Il colloquio che ha luogo tra CPU e periferica ha in generale come scopo quello <strong>di</strong> trasmettere dati nell’una o<br />
nell’altra <strong>di</strong>rezione e realizza tale obiettivo me<strong>di</strong>ante operazioni che verificano l’opportunità <strong>di</strong> dare inizio al colloquio,<br />
effettuano la trasmissione vera e propria, controllano lo stato delle apparecchiature ed il verificarsi <strong>di</strong> eventuali errori.<br />
Il protocollo definisce, allora, apposite fasi dette apertura, corpo, chiusura e forniscono le regole per ciascuna<br />
attività inclusa nelle singole fasi.<br />
Talvolta è possibile che si verifichi il collegamento <strong>di</strong> sistemi periferici, che a loro volta sono connessi ad altri<br />
supporti e questi ultimi possono consistere in aree <strong>di</strong> memoria in<strong>di</strong>rizzabili. Bisogna, perciò, inserire all’interno del<br />
colloquio le operazioni necessarie alla selezione della singola unità periferica e, al suo interno, delle posizioni del<br />
supporto da o per il quale il movimento dei dati deve avvenire.<br />
Una seduta <strong>di</strong> colloquio tra CPU e periferia è in genere de<strong>di</strong>cata alla trasmissione <strong>di</strong> un certo numero <strong>di</strong> dati<br />
elementari. Perciò a seconda dei casi si trasmette un insieme <strong>di</strong> dati singoli, un unico blocco oppure insiemi <strong>di</strong> blocchi.<br />
CONTROLLO DEGLI ERRORI<br />
Nel colloquio con periferiche più sofisticate o in sistemi più completi si prevedono operazioni <strong>di</strong> controllo su<br />
eventuali errori o funzionamenti anormali e apposite fasi, oltre le tre precedentemente enunciate, possono essere<br />
de<strong>di</strong>cate a tale scopo.<br />
Solitamente il problema del controllo <strong>di</strong> errori all’interno della trasmissione si risolve trasformando i messaggi<br />
in messaggi ridondanti ed effettuando, in ricezione, un controllo <strong>di</strong> compatibilità tra il messaggio ricevuto e le regole<br />
alle quali esso si deve attenere affinché esso risulti corretto. Il più semplice controllo è quello effettuabile con il bit <strong>di</strong><br />
parità. Il protocollo <strong>di</strong> colloquio definisce da un lato le regole attraverso le quali il sistema in<strong>di</strong>vidua un errore e<br />
dall’altro le azioni conseguenti. Alcuni protocolli localizzano alla fine del colloquio la fase <strong>di</strong> controllo <strong>di</strong> eventuali errori<br />
da implementare con la tecnica dello scambio <strong>di</strong> coman<strong>di</strong> e stati; altri protocolli, invece, prevedono un controllo<br />
continuo sul trasferimento e sospensione <strong>di</strong> quest’ultimo in caso <strong>di</strong> errore.<br />
SINCRONIZZAZIONE<br />
I messaggi inviati in ambo le <strong>di</strong>rezioni debbono essere sincronizzati, vale a <strong>di</strong>re che l’apparecchiatura<br />
ricevente deve essere in qualche modo informata dell’istante in cui il messaggio è effettivamente in arrivo. Prende il<br />
nome <strong>di</strong> strobe-in il segnale <strong>di</strong> sincronizzazione verso la CPU, mentre è detto strobe-out il segnale <strong>di</strong><br />
sincronizzazione verso la periferia.<br />
La tecnica per lo più usata per ottenere il colloquio tra due apparecchiature è la tecnica asincrona, nome<br />
derivante dal fatto che lo sviluppo del colloquio è con<strong>di</strong>zionato da risposte reciproche, che avvengono tra i due<br />
<strong>di</strong>spositivi. Questo tipo <strong>di</strong> gestione della sincronizzazione permette un controllo del colloquio stesso, determinando<br />
sviluppi <strong>di</strong>versi a seconda delle risposte che vengono ricevute. Per un corretto funzionamento della tecnica asincrona si<br />
deve tener conto della con<strong>di</strong>zione <strong>di</strong> time-out.<br />
La con<strong>di</strong>zione <strong>di</strong> time-out si verifica se non perviene alcuna risposta entro prefissati limiti <strong>di</strong> tempo e<br />
solitamente essa ha luogo in presenza <strong>di</strong> guasti o <strong>di</strong> funzionamento non corretto. Sono proprio i protocolli a porre un<br />
tempo limite, facendo in modo tale da non permettere al sistema <strong>di</strong> bloccarsi.<br />
Diversamente opera invece la tecnica sincrona, che basa il suo funzionamento esclusivamente sull’utilizzo <strong>di</strong><br />
un segnale esterno <strong>di</strong> tempificazione, detto segnale <strong>di</strong> clock. Questo meccanismo poggia sulla misura <strong>di</strong> intervalli <strong>di</strong><br />
tempo, infatti, due <strong>di</strong>spositivi si inviano messaggi ed effettuano il colloqui ad una frequenza preassegnata. In input si<br />
esclude il controllo da parte della CPU, ma la periferia invia il dato in<strong>di</strong>pendentemente dalla richiesta; in output la CPU,<br />
generalmente più veloce, deve essere rallentata per successive operazioni.<br />
MODELLO FONDAMENTALE <strong>DI</strong> PROGRAMMAZIONE<br />
Il modello definisce la sua struttura <strong>di</strong> interfaccia, il suo schema risulta molto elementare: il processore vede<br />
soltanto un insieme <strong>di</strong> registri singolarmente in<strong>di</strong>rizzabili; CPU ed interfaccia sono collegate attraverso un unico busdati<br />
bi<strong>di</strong>rezionale ed un bus-in<strong>di</strong>rizzi, che seleziona il registro in<strong>di</strong>rizzato. Nella realtà fisica il processore è collegato con<br />
un insieme <strong>di</strong> interfacce, ciascuna contenente un numero <strong>di</strong>screto <strong>di</strong> registri: lo spazio in<strong>di</strong>rizzi è <strong>di</strong>viso tra le <strong>di</strong>verse<br />
interfacce.<br />
Il modello definisce anche la semantica delle istruzioni in linguaggio macchina, vale a <strong>di</strong>re, stabilisce le microoperazioni<br />
da esse realizzate. Il modello contiene solo istruzioni <strong>di</strong> ricezione o trasmissione <strong>di</strong> un dato singolo e,<br />
coerentemente con l’interfaccia, si intende un’operazione <strong>di</strong> ingresso quella che porta il dato dal bus-dati de<strong>di</strong>cato<br />
all’interno del processore, per operazione d’uscita si intende l’operazione contraria. A seconda dei casi e delle tecniche<br />
<strong>di</strong> in<strong>di</strong>rizzamento implicite od esplicite, operan<strong>di</strong>-registri o operan<strong>di</strong>-memoria, se vengono utilizzati in<strong>di</strong>rizzi <strong>di</strong> registri,<br />
allora il modello fondamentale evolve in modello a registri in<strong>di</strong>rizzabili.<br />
MODELLO MEMORY MAPPED E ISOLATED I/O<br />
Alcuni processori non possiedono un’apposita sezione <strong>di</strong> collegamento con l’I/O, ma prendono la sezione <strong>di</strong><br />
collegamento con la memoria e fanno coincidere fisicamente il bus-in<strong>di</strong>rizzi con il registro memory address e il bus-dati<br />
con il memory buffer. Un apposito selettore abilita l’una o l’altra apparecchiatura. Il modello così definito viene<br />
qualificato come modello memory mapped o a registri in<strong>di</strong>rizzabili. Se invece lo spazio <strong>di</strong> in<strong>di</strong>rizzamento viene<br />
assunto come in<strong>di</strong>pendente e costituisce un’unità a sé stante, allora si parla <strong>di</strong> isolated I/O, laddove vengono definite<br />
apposite operazioni ed istruzioni, <strong>di</strong>stinte da quelle del processore per effettuare l’ingresso-uscita.<br />
SCAMBIO DATI<br />
La ricezione da parte del processore dello stato della periferia e la possibilità <strong>di</strong> interrogarlo per con<strong>di</strong>zionare<br />
lo sviluppo del programma <strong>di</strong> I/O è <strong>di</strong> fondamentale importanza per ogni sistema, che debba implementare un<br />
protocollo. Talune architetture sono basate sul modello fondamentale e pongono una soluzione al problema attraverso<br />
l’utilizzo <strong>di</strong> un driver per la gestione della periferia: in un particolare registro vi è memorizzato lo stato della periferica,<br />
oppure informazioni che siano <strong>di</strong> maggior dettaglio per l’apparecchiatura.
Per un generico <strong>di</strong>spositivo l’informazione potrebbe essere lo stato acceso, spento, pronto per<br />
operazioni; invece per informazioni <strong>di</strong> maggior dettaglio si intendono informazioni intimamente legate al tipo <strong>di</strong><br />
periferica: per una stampante l’informazione potrebbe essere la presenza <strong>di</strong> carta, presenza <strong>di</strong> inchiostro…<br />
Il protocollo deve tener conto <strong>di</strong> tale classificazione e l’acquisizione dello stato può essere gestita a più livelli:<br />
ad un primo possono essere rilevate informazioni generali, che siano comuni a qualsiasi operazione <strong>di</strong> I/O, ai livelli<br />
successivi sono interrogati, se necessario, registri contenenti informazioni sempre più specifiche a seconda della<br />
singola unità.<br />
PROTOCOLLO HANDSHAKE<br />
La tecnica fondamentale del colloquio asincrono prevede un messaggio <strong>di</strong> richiesta dato (req) ed una <strong>di</strong><br />
risposta dato da parte della periferia e che al dato in input sia associato un segnale <strong>di</strong> strobe-in. Analogamente per<br />
l’output vi è un messaggio che segnala il riconoscimento del dato (ack) e la sincronizzazione avviene attraverso uno<br />
strobe-out. Un protocollo nel quale il dato sia elementare ed i messaggi <strong>di</strong> req ed ack siano semplici messaggi binari<br />
è detto handshake. I passi fondamentali del colloquio sono tipicamente contenuti in appositi programmi costituenti il<br />
nucleo fondamentale del driver <strong>di</strong> I/O.<br />
Il protocollo handshake <strong>di</strong> ingresso avviene con lo scambio dei segnali binari req e strobe-in, con i due flipflop<br />
C ed F ed un registro <strong>di</strong> ingresso. I segnali da e per la periferia sono:<br />
• req<br />
segnale collegato al flip-flop C agisce sulla periferica al fronte <strong>di</strong> salita; la richiesta req si ottiene<br />
ponendo in set il flip-flop C;<br />
• strobe-in<br />
segnale proveniente dalla periferia consente la memorizzazione del dato nei registri e svolge una<br />
funzione logica, posizionando il registro F, che può essere interrogato dal programma.<br />
C<br />
req<br />
F<br />
strobe-in<br />
RI<br />
dato<br />
interfaccia I/O<br />
controllo periferica<br />
Il processore in un primo momento lancia la richiesta <strong>di</strong> un dato, poi si pone in attesa del suo arrivo, infine, lo<br />
acquisisce. Il tempo che il processore deve attendere dal via dell’operazione sino all’arrivo del segnale <strong>di</strong> strobe<br />
<strong>di</strong>pende dalla velocità con cui il sistema periferico lavora e può anche essere notevole, se confrontato con i tempi <strong>di</strong><br />
funzionamento generali del processore.<br />
Analogamente al protocollo handshake per i dati in entrata, v’è il protocollo per handshake <strong>di</strong> uscita. Il<br />
registro C, in questo caso, fornisce il segnale <strong>di</strong> strobe-out ed F il segnale <strong>di</strong> ack. La sequenza delle operazioni è<br />
analoga a quelle del caso precedente.<br />
C<br />
strobe-out<br />
F<br />
ack<br />
RI<br />
dato<br />
interfaccia I/O<br />
controllo periferica<br />
GESTIONE DELL’I/O<br />
Durante il tempo <strong>di</strong> attesa delle operazioni <strong>di</strong> input od output, il processore resta inattivo e pertanto sono<br />
utilizzate due tecniche per ridurre i tempi morti:<br />
• overlay<br />
questo genere <strong>di</strong> soluzione consiste nell’organizzare il driver in modo che esso operi su un singolo<br />
carattere e nel fare in modo che il programma principale tra una chiamata e l’altra esegua altre<br />
operazioni, purché queste abbiano un tempo <strong>di</strong> esecuzione inferiore a quello che occorre tra una<br />
richiesta e l’arrivo del corrispondente dato;<br />
• interruzioni<br />
supponendo abilitato il sistema delle interruzioni, l’invio del segnale mandato da C alla periferica,<br />
rende quest’ultimo sensibile alla risposta associata, viaggiante su F, che si presenta sotto forma <strong>di</strong><br />
interruzione. Il processore in attesa <strong>di</strong> quest’ultima non deve necessariamente effettuare un ciclo a<br />
vuoto e può effettuare altre operazioni.
I/O ME<strong>DI</strong>ANTE INTERRUZIONI<br />
Le interruzioni possono essere utilizzate sia per le operazioni in input, che in output:<br />
• input<br />
la sequenza è implementata sostituendo il set del registro C con l’abilitazione del flip-flop M i della<br />
maschera delle interruzioni; in luogo dell’attesa il processore può svolgere altre operazioni, mentre la<br />
periferica, non appena pronto il dato, segnala l’evento ponendo ad 1 l’i-esimo registro della richiesta<br />
<strong>di</strong> interruzione; il servizio <strong>di</strong> questa causa <strong>di</strong> interruzione provvede all’effettuazione dell’operazione <strong>di</strong><br />
input;<br />
• output<br />
con la sincronizzazione a mezzo dell’interruzione si ottiene, dunque, il vantaggio che il processore è<br />
utilmente impiegato nell’attesa che la periferica sia pronta per eseguire l’operazione: il processore <strong>di</strong><br />
conseguenza svolge complessivamente una quantità <strong>di</strong> lavoro maggiore nell’unità <strong>di</strong> tempo. Per<br />
contro il tempo che trascorre dall’istante in cui la periferica è effettivamente pronta e l’istante in cui<br />
viene servita è maggiore rispetto alla tecnica dell’overlay. In quest’ultima, infatti, il tempo per<br />
l’operazione è dell’or<strong>di</strong>ne <strong>di</strong> grandezza necessario per l’esecuzione <strong>di</strong> una o due istruzioni, invece qui<br />
è il tempo necessario per eseguire la parte <strong>di</strong> testa della ISR.<br />
Questi appunti sono stati scritti da hunter85 per il sito http://www.quelli<strong>di</strong>informatica.org. Per informazioni,<br />
correzioni, chiarimenti e altro utilizzare il servizio <strong>di</strong> messaggistica messo a <strong>di</strong>sposizione della comunità.