il sistema di i/o - Quelli di Informatica

Transcript

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