Componenti di un elaboratore
-
un'unita aritmetico-logica (ALU) in grado di eseguire semplici operazioni algebriche e logiche;
-
un'unità di controllo (CU) che governa il funzionamento dell'ALU e di altri dispositivi di minore importanza in funzione del tipo di istruzione che l'elaboratore sta eseguendo;
-
un sistema di ingresso (modulo di input) per acquisire dati dall'esterno;
-
un sistema di uscita (modulo di output) per comunicare all'esterno i dati dell'elaborazione;
-
una memoria temporanea in grado di contenere sia l'algoritmo (programma) che l'elaboratore deve eseguire, sia i valori dei dati che possono essere necessari ai fini dell'esecuzione dell'algoritmo stesso.
Elaborazione di una istruzione
L'elaborazione richiesta per ogni singola istruzione è detta
ciclo di istruzione ed è formata da una serie di operazioni che sono il caricamento dell'istruzione, il caricamento e la memorizzazione di zero o più operandi e infine il controllo delle interruzioni. Nella forma più semplice si articola in due cicli:
-
fetch: ciclo di caricamento. Nel calcolatore classico il PC (Program Counter) contiene l'adr dell'istruzione successiva da eseguire. Il processore carica quindi dalla memoria nell'IR (Istruction Register) l'istruzione puntata da PC, e incrementa quindi PC in modo che punti alla prossima istruzione.
-
execute: ciclo di esecuzione. In questa fase la CPU interpreta il codice operativo e calcola l'adr dell'operando; preleva l'operando ed esegue l'istruzione indicata.
La sequenza di bit memorizzata nell'IR indica l'azione che deve essere realizzata dal processore (primi 4 bit, codice operativo) e l'adr in memoria relativo a tale operazione, il quale prima la interpreta e poi la esegue. Queste azioni possono essere classificate in 4 categorie: processore-memoria (trasferimento di dati tra CPU e Main Memory MM), processore-I/O (trasferimento dati tra CPU e disp di I/O), elaborazione dati (esecuzione di operazioni aritmetiche e/o logiche sui dati), controllo (per gestire l'alterazione dell'ordine delle istruzioni causato da alcune istruzioni)
-
interrupt: ciclo di gestione interruzioni: se sono abilitate e nel caso in cui se ne manifesta una, allora salva lo stato corrente (context) del processo e si occupa dell'interruzione. Terminata l'esecuzione di quest'ultima, torna al programma interrotto recuperando il context. Se invece gli interrupt sono disattivi salta direttamente al ciclo di fetch successivo
Interruzioni
Meccanismo attraverso il quale altri moduli, come i dispositivi di I/O, possono interrompere la normale sequenza del processo in esecuzione per eseguire altre routine.
Dal punto di vista del programma utente un'interruzione non è altro che un'interruzione della normale sequenza di esecuzione: quando l'elaborazione della richiesta dall'interruzione è stata completata viene ripristinata l'esecuzione di partenza nel punto in cui era stata interrotta. Di conseguenza, il programma utente non necessita di alcun codice particolare per gestire le interruzioni: il processore e il sistema operativo sono gli unici responsabili della sospensione del programma utente e della sua ripresa nello stesso punto. Per permettere le interruzioni, viene aggiunto un
ciclo di interruzione al ciclo di istruzione durante il quale il processore controlla se si è verificata un'interruzione, la cui presenza è indicata da un segnale di interrupt. Se non ci sono interruzioni pendenti il processore va avanti nel ciclo di fetch.
Nel caso in cui ci sia invece un'interruzione in attesa, il processore:
-
sospende l'esecuzione del programma corrente e salva il suo context, ovvero l'insieme dello stato dei suoi registri in particolare salva l'adr puntata da PC (la prossima istruzione da eseguire) e qualunque altro dato utile per la sua attività in corso;
-
assegna al PC l'adr di partenza della procedura di gestione dell'interrupt;
-
il processore prosegue quindi con la fase di fetch dell'istruzione puntata da PC ovvero della prima istruzione della routine dell'interruzione ed esegue le varie istruzioni in sequenza;
-
al termine della routine dell'interruzione vi è il ripristino del context e la ripresa dell'esecuzione del precedente programma.
Interruzioni multiple approcci
Ci sono due diversi approcci per gestire le interruzioni multiple.
-
disable interrupt. Gli interrupt vengono disattivati, nel senso che il processore ignora questi segnali durante l'esecuzione di una istruzione. Se arriva un segnale di interrupt in questo lasso di tempo, esso rimane generalmente pendente e verrà controllato dal processore solo dopo che questo ha riabilitato gli interrupt, al temine dell'esecuzione dell'istruzione in corso. In questo modo le interruzioni vengono eseguite in ordine strettamente sequenziale, senza prendere in considerazione necessità di priorità di tempo.
-
define priorities: Vengono assegnate dei livelli di priorità ai vari interrupt e si ha così la possibilità che una interruzione di priorità maggiore blocchi il gestore di interruzioni con priorità inferiore prendendo la precedenza su questa.
Struttura di interconnessione
Un calcolatore è costituito da un insieme di componenti connessi tra loro al fine di scambiarsi dati e segnali di controllo. Questa struttura di connessione realizzata viene progettata a seconda degli scambi di informazioni che devono avvenire tra i vari moduli, dipendenti quindi appunto dal tipo di questi ultimi.
Esistono fondamentalmente tre diversi moduli fondamentali:
-
memory: generalmente un modulo di memoria è realizzato da N parole di uguale lunghezza ad ognuna delle quali è assegnato un adr numerico univoco in ordine sequenziale; ogni parola può essere letta da o scritta in memoria tramite opportuni segnali di controllo. Quindi in ingresso alla memoria ci sono un segnale di controllo, segnali di adr e segnali di dati; in uscita segnali di dato.
-
modulo di I/O: il modulo di I/O ha funzionalità simili a quelle della memoria. Sono possibili operazioni di lettura e scrittura di dati e invio e ricezione di segnali di controllo o di interrupt. I diversi dispositivi fisici esterni sono identificati attraverso delle porte dotate di indirizzi univoci. Quindi in ingresso ha, come la memoria, controlli, indirizzi e dati, ma i dati sono divisi in interni ed esterni; in uscita i dati sono nuovamente divisi in dati interni ed esterni. Inoltre sono presenti segnali di interrupt.
-
processore: legge istruzioni e dati e scrive dati al termine dell'elaborazione; usa i segnali di controllo per regolare l'intera operatività del sistema e riceve i segnali di interrupt dai vari dispositivi. Quindi riceve in ingresso istruzioni/dati ed interrupt e in uscita manda adr, dati stessi e segnali di controllo.
Le interconnessioni tra i vari dispositivi vengono realizzate mediante bus.
Gli elementi fondamentali nella progettazione dei bus sono:
- arbitraggio
-
sincronizzazione
-
larghezza di banda
Una delle componenti principali di un calcolatore è detto
bus di sistema, ed è quello su cui si basano le più comuni strutture di interconnessione del calcolatore stesso.

A seconda del tipo di informazioni che trasportano e del collegamento che quindi instaurano si differenziano in (classificazione funzionale):
-
data bus: costituiscono i link su cui vengono trasferiti i dati (comprese le istruzioni) tra i moduli del sistema. Sono generalmente formati da 8, 16 o 32 linee diverse, il cui numero di linee determina la larghezza del bus. Poiché una linea può trasferire un solo bit per volta, il numero di linee determina il numero di bit che possono essere trasmessi simultaneamente, determinando le prestazioni globali del sistema. (L'interfaccia seriale viene utilizzata solo nel SATA).
-
address bus: sono usate per specificare la sorgente o la destinazione dei dati che si trovano sul data bus dedicato al loro trasferimento. La larghezza dell'adr bus determina la massima capacità di indirizzamento del sistema e quindi la massima memoria. Le linee di adr sono inoltre usate anche per fare riferimento alle porte di I/O.
-
control bus: linee utilizzate per controllare l'accesso e l'uso dei data e adr bus, visto che esse sono condivise da tutti i componenti. (Architettura a bus condivisi). I segnali di controllo trasmettono sia informazioni di tempo che di comando tra i vari moduli del sistema: i segnali del primo tipo indicano la validità delle informazioni su dati e adr, mentre quelli del secondo tipo specificano le operazioni che devono essere eseguite.
Le linee di un bus possono essere organizzate in due tipi diversi:
-
dedicate bus: una linea di bus dedicata è assegnata in modo permanente allo svolgimento di una funzione o ad un sottoinsieme fisico di componenti di un calcolatore. Ad esempio possono essere dedicate linee separate per i dati e per gli indirizzi. Si realizza così un sistema fisico dedicato in cui l'uso di bus multipli, ognuno dei quali è collegato ad un sottoinsieme di moduli, permette un levato grado di prestazioni grazie alla minore disputa per il controllo del bus. Tuttavia ciò comporta un sistema di dimensioni maggiori e quindi più costoso
-
multiplexed bus: le stesse linee vengono qui utilizzate per scopi diversi attraverso la tecnica della multiplazione temporale. L'uso di poche linee permette così un risparmio di spazio, ma ogni modulo deve così presentare una maggior circuiteria necessaria ad attuare la multiplazione temporanea, che si traduce quindi in una riduzione delle prestazioni generali del sistema.
Esempio di trasferimento di dati e indirizzi sullo stesso bus
Info di dati e adr possono essere trasmessi sullo stesso insieme di linee utilizzando una linea di controllo di validità dell'adr. All'inizio di un trasferimento di dati, l'adr è posto sul bus e viene attivata tale linea; a questo punto, ogni modulo ha un intervallo di tempo limitato per copiare l'adr e determinare se è lui stesso il modulo destinatario. In seguito, l'adr viene rimosso dal bus e sono utilizzate le stesse connessioni per i successivi trasferimenti di lettura o scrittura di dati.
Funzionamento del bus
Se un modulo desidera inviare dati ad un altro deve fare essenzialmente due cose:
-
ottenere l'uso del bus mediante arbitraggio;
-
trasferire i dati attraverso di esso (bus dati).
Se invece un modulo deve richiedere dati ad un altro modulo deve allora:
-
ottenere l'uso del bus mediante arbitraggio;
-
trasferire una richiesta all'altro sulle linee di controllo e di indirizzo appropriate
-
aspettare che il modulo destinatario della richiesta invii i dati sul data bus.
Arbitraggio del bus
In tutti i sistemi ci può essere più di un modulo che necessita l'uso del bus e poiché solo un'unità alla volta può trasmettere dati attraverso il bus è necessario, quindi, definire un metodo per il suo arbitraggio
. I vari approcci attuabili si distinguono in:
-
centralized arbitration: Un solo dispositivo hw detto bus controller o arbiter è responsabile dell'allocazione temporale del bus.
-
distribuited arbitration: Non vi è alcun controllore centrale in quanto ogni modulo dispone di una logica per l'accesso al controllo e condivide il bus con tutti gli altri dispositivi.
Nei vari metodi di arbitraggio lo scopo è quello di designare un dispositivo (arbitro), che può essere un processore o un modulo di I/O, come padrone del bus, assegnandogli i poteri di avviare un trasferimento dei dari
Temporizzazione del bus
Esistono due modi diversi con cui gli eventi sono coordinati dal bus.
-
temporizzazione sincrona: gli eventi sul bus sono sincronizzati da un segnale di clock incluso su una linea del bus. Una singola trasmissione della sequenza 1-0 sulla linea di clock è detto ciclo di clock o ciclo di bus e definisce l'unita di tempo. Tutti i dispositivi collegati al bus possono dunque leggere la linea di clock e tutti gli eventi vengono fatti partire all'inizio di un ciclo di clock.
-
temporizzazione asincrona: il verificarsi di eventi sul bus dipende dall'occorrenza di un evento precedente.
La temporizzazione sincrona è più semplice sia da implementare che da verificare, ma è meno flessibile di quella asincrona. Ciò è dovuto al fatto che tutti i dispositivi che sono collegati ad un bus sono strettamente legati all'andamento fissato del clock e quindi il sistema non può sfruttare i progressi nelle prestazioni dei dispositivi, mentre con la temporizzazione asincrona si ha un misto di dispositivi lenti e veloci che usano tecnologie più vecchie e più recenti e che condividono lo stesso bus a velocità quindi diverse.
Architettura del bus
Se un bus viene collegato con molti dispositivi, si avrà un calo delle prestazioni del calcolatore dovuto principalmente a due motivi:
-
in generale, più sono i dispositivi attaccati ad un bus, più è grande la lunghezza del bus e quindi maggiore è il ritardo dovuto alla propagazione dei dati. Questo ritardo determina la quantità di tempo che i dispositivi impiegano a coordinare l'uso del bus;
-
il bus può diventare un collo di bottiglia se la domanda totale di dati da trasferire si avvicina alla sua capacità. Questo problema può essere contrastato in qualche modo aumentando il tasso di dati che il bus può trasportare ed usando bus più larghi.
Per questi motivi risulta più efficiente l'uso di bus multipli organizzati in una gerarchia.
I controllori di I/O vengono quindi collegati al bus di sistema mediante
bus di estensione attraverso delle interfacce che si occupano di conservare temporaneamente i trasferimenti di dati tra tra i due lati. Tale struttura permette di separare il traffico tra processore e memoria da quello verso l'I/O. Questo sistema risulta essere abbastanza efficiente ma tende a diminuire con il crescere delle prestazioni dei dispositivi di I/O.

Architettura bus ad alte prestazioni
E' un'organizzazione di bus ad alta velocità progettata per servire dispositivi di I/O molto capaci. Un bus locale collega il processore al controllore della cache (ora integrata nel core della CPU), che a sua volta è collegato ad un bus di sistema che serve la memoria principale. Il controllore della cache è integrato su un bridge collegato al
High-Speed Bus (Video, LAN, SCSI).
I dispositivi più lenti vengono invece ancora serviti da un bus di estensione, dotato di una interfaccia di memorizzazione dei dati che viaggiano tra di esso ed il bus ad alta velocità.
Il bus ad alta velocità pone più vicini al processore i dispositivi con molte richieste ed è indipendente dal processore stesso; vengono tollerate differenze nelle velocità tra il processore ed il bus ad alta velocità e nelle definizioni della linea dei segnali. Modifiche nell'architettura del processore non influenzano il bus ad alta velocità e viceversa.
Bus PCI
La connessione delle
Peripheral Component Interconnection (PCI) è realizzata mediate un popolare bus ad alta larghezza di banda, indipendente dal processore, che può essere usato come bus periferico. E' stato progettato per soddisfare economicamente le richieste di I/O dei moderni sistemi di calcolatori in quanto servono solo pochi chip per implementare e convalidare atri bus collegati al bus PCI stesso. Esso fornisce un insieme di funzionalità general-purpose e fa uso di temporizzazione sincrona e di uno schema di arbitraggio centralizzato.
L'arbitraggio viene realizzato in modo che ogni master dispone di una linea per la richiesta ed una per la connessione del bus. Queste linee di segnale sono collegate ad un arbitro centrale e l'affidamento dell'uso del bus viene fatto utilizzando un semplice protocollo di richiesta-connessione handshake. La specifica PCI non indica un particolare algoritmo di arbitraggio. Il master PCI deve arbitrare ogni transazione che vuole eseguire e che è formata da una fase di indirizzo seguita da una o più fasi successive di dati.
La combinazione di un controllore DRAM ed un bridge per il bus PCI consente una stretta connessione con il processore e la possibilità di trasferire dati a velocità elevate. Il ponte si comporta come un buffer di dati e, quindi, la velocità del bus PCI può essere diversa dalla capacità di I/O del processore. In sostanza, quindi, l'uso del ponte rende il PCI indipendente dalla velocità del processore e consente di ricevere e inviare dati rapidamente.
Memorie
La cella di memoria
La cella di memoria è l'elemento base di una memoria a semiconduttore. Deve avere la proprietà di avere due stati stabili che possono essere usati per rappresentare il bit 1 ed il bit 0. E' scrivibile almeno una volta per poter inizializzare il suo stato. E leggibile per poter recuperare il suo stato. Una cella di memoria ha in genere tre terminali funzionali capaci di trasportare un segnale elettrico. Il
terminale di selezione seleziona una cella di memoria per una operazione di lettura o scrittura; il
terminale di controllo indica il tipo di operazione.
Caratteristiche
Caratteristiche fisiche
In base alla persistenza o meno dei dati in assenza di alimentazione
-
memoria volatile: le informazioni vengono perse e decadono quando la corrente elettrica viene staccata. (RAM)
-
memoria non volatile: le informazioni memorizzate non si deteriorano fintanto che non vengono modificate appositamente infatti sono in grado di conservare le info salvate anche in assenza di alimentazione elettrica. (hard disk)
Localizzazione:
-
all'interno della CPU cache
-
internal
-
external
Capacità:
-
dimensione parola base nell'organizzazione delle informazioni
-
numero di parole (o byte)
Metodi di accesso:
-
accesso sequenziale: la memoria è organizzata in unità di dati, dette record, per cui gli accessi devono essere fatti secondo una sequenza lineare. In memoria sono inserite una serie di informazioni relative agli indirizzi, che sono usate per separare i vari record e per fornire assistenza in fase di recupero dei dati. Per quest'ultima operazione viene utilizzato un meccanismo condiviso di lettura e scrittura. Il tempo di accesso è molto variabile. (unità a nastro)
-
accesso diretto: necessita di un meccanismo condiviso di lettura e scrittura, ma in questo caso blocchi o record hanno tutti un indirizzo unico basato sulla loro locazione fisica. In questo modo per accedervi il metodo è diretto e consiste nel raggiungere una posizione ad essi vicina a cui va aggiunta una ricerca sequenziale, un conteggio oppure un'attesa per giungere alla locazione finale. Il tempo di accesso è chiaramente variabile. (disco magnetico: sposto la testina in un settore e poi faccio accesso sequenziale)
-
accesso casuale: ogni locazione indirizzabile che si trova in memoria ha un unico meccanismo di indirizzamento cablato. Il tempo di accesso è indipendente dalla sequenza degli accessi precedenti ed è costante. (RAM e alcuni sistemi di cache)
-
associativo: si tratta di un tipo di memoria casuale che permette di confrontare determinate locazioni di bit interne ad una parola e di farlo per tutte le parole contemporaneamente. In questo modo una parola viene recuperata in base ad una porzione del suo contenuto piuttosto che per il suo indirizzo. Il tempo di recupero dei dati è costante ed è indipendente dalla posizione o dagli accessi precedenti. Le memorie cache possono utilizzare metodi di accesso associativo.
Parametri per valutare le prestazioni di una memoria
-
tempo di accesso: per le memorie ad accesso casuale questo valore indica il tempo necessario per eseguire una operazione di lettura o di scrittura, ovvero l'intervallo di tempo a partire dal momento in cui viene presentato un adr alla memoria, al momento in cui i dati di quella locazione sono memorizzati oppure resi disponibili. Per le memorie ad accesso non casuale rappresenta il tempo necessario per posizionare il meccanismo di lettura e scrittura sulla posizione indicata.
-
tempo di ciclo di memoria: caratteristico della memoria ad accesso casuale, comprende il tempo di accesso più il tempo richiesto prima dell'inizio di un eventuale secondo accesso.
-
velocità di trasferimento: indica la velocità con cui i dati possono essere trasmessi da un'unità di memoria; nel caso di memorie ad accesso casuale corrisponde a 1/(tempo di ciclo)
-
organizzazione: termine con cui si indica la disposizione fisica dei bit che formano una parola;
-
località spaziale: durante l'esecuzione di un programma, i riferimenti fatti alla memoria da parte del processore, sia per i dati che per le istruzioni, tendono ad essere raggruppati. Di conseguenza è opportuno organizzare i dati nella gerarchia in modo tale che la % di accessi ad ogni livello più basso è sostanzialmente minore di quella ai livelli più alti.
Gerarchia delle memorie
L'organizzazione della memoria di tipo gerarchico nasce dal bisogno di un compromesso tra le prestazioni in termini di tempi di accesso, la dimensione della memoria e il costo per bit. Questi tre parametri sono legati tra loro in questo modo:
-
minore è il tempo di accesso di una memoria e maggiore è il costo per bit;
-
maggiore è la dimensione e minore è il costo per bit
-
maggiore è la dimensione e maggiore è il tempo di accesso
A seconda del livello in cui ci si trova si applica quindi un diverso compromesso tra i parametri in questione in base alle necessità. Partendo dal livello più alto troviamo:
-
registri della CPU: integrati nel core della CPU, sono le memorie in assoluto più veloci che lavorano alla stessa frequenza del processore e pertanto sono molto costose
-
memoria principale: costituita da:
- uno o più livelli di cache (L1 L2): più veloce della RAM ma di modestissime dimensioni. In genere non è visibile al programmatore o, addirittura al processore, in quanto è un dispositivo che conserva i dati trasferiti tra la memoria principale ed i registri del processore e che viene utilizzato per migliorare le prestazioni
- dalla RAM
Una parte della memoria principale può essere utilizzata come buffer per conservare temporaneamente dati che devono essere trasferiti sul disco per essere letti.
-
memoria esterna: (disk cache, disk,...) dove i dati vengono memorizzati in maniera non volatile come negli hard-disk, cd-rom, chiavette...
L'organizzazione è tale per cui ai livelli più bassi si ha un basso costo per bit dato dalle grandi dimensioni e dal maggiore tempo di accesso che comunque, grazie alla minore frequenza degli accessi da parte del processore, non abbassa in maniera drammatica le prestazioni generali del sistema.
Tipi di memoria
-
random access memory RAM (le singole parole di memoria sono recuperate in modo diretto per mezzo di logica ad indirizzamento cablato)
capacità di leggere e scrivere dati in memoria in maniera piuttosto semplice e veloce, grazie all'uso di segnali elettrici; è volatile e quindi necessita di una continua alimentazione ad energia elettrica che, in caso di interruzione provoca la perdita dei dati; è adatta quindi ad un uso esclusivo come memoria temporanea.
Può essere:
- statica: i bit sono memorizzati per mezzo di configurazioni di classiche porte logiche di tipo flip-flop; è usata prevalentemente per la cache in quanto più veloce e a più basso grado di integrazione
- dinamica: è formata da celle che conservano i dati sotto forma di cariche su condensatori: la presenza o l'assenza di carica è interpretata come un bit 1 o 0 e, poiché i condensatori tendono a scaricarsi, le RAM dinamiche richiedono periodiche operazioni di refresh dei dati.
-
read only memory ROM: memoria di sola lettura non volatile che contiene un insieme permanente di dati che non possono essere modificati. Si tratta di librerie di sotto-procedure per funzioni di richieste frequentemente, programmi di sistemi BIOS, tavole di funzioni. I dati e i programmi risiedono così in maniera permanente in memoria principale e non hanno mai bisogno di essere caricati da un dispositivo di memorizzazione secondario. Tuttavia la fase di inserimento dei dati ha un costo fisso piuttosto alto e non è consentito fare errori.
-
programmable ROM PROM: read only memory ma programmabili elettricamente (una volta)
-
erasable PROM EPROM: letta e scritta (+ di una volta) elettricamente come la prom ma, prima di una operazione di scrittura, tutte le celle di memoria devono essere cancellate e riportate allo stesso stato iniziale per mezzo dell'esposizione a raggi ultravioletti
-
electrically erasable PROM: può essere scritta elettricamente in qualsiasi momento e senza dover cancellare i contenuti già presenti, se non i/il byte che devono essere aggiornati.
-
flash memory: è una via di mezzo tra la EPROM e la EEPROM sia per quanto riguarda i costo che la funzionalità. Utilizza una tecnologia elettrica per la cancellazione. Viene utilizzato un solo transistor per ogni bit per cui si può ottenere un'alta densità.
Organizzazione della RAM
Una memoria può essere vista come un insieme di parole di n bit. Ad es una memoria da 16 Mbit può essere vista come 1M di parole (blocchi) da 16 bit. I blocchi sono tali per cui i bit relativi ad una parola occupano la stessa posizione (vedendo il blocco come una matrice, i bit da 0 a 15 di una parola occupano la stessa posizione nei 16 blocchi). I blocchi sono in genere delle matrice quadrate, così che le stesse linee di indirizzo possono essere usate a turno (mediante multiplexing) per indirizzare riga e colonna => mi serve solo la metà dei pin
Tipi di errori e codici di correzione
Si possono avere i due seguenti tipi di errori:
- guasto hardware: è un problema fisico permanente che provoca la memorizzazione non più affidabile dei dati da parte delle celle di memoria coinvolte, il cui contenuto, infatti, può non essere più modificabile oppure può fluttuare tra 0 e 1.
- errore trascurabile: è un evento casuale e non distruttivo che altera il contenuto di una o più celle, senza danneggiare l'intera memoria.
Per sopperire a questi errori si usano in genere dei codici di correzione degli errori.
Quando dei dati devono essere scritti in memoria, viene eseguita un'elaborazione sui dati così da generare un codice che viene memorizzato insieme ai dati stessi. Se deve essere conservata una parola di dati di M bit ed il codice ha una lunghezza di K bit, allora la dimensione della parola memorizzata è di M + K bit. Quando la parola memorizzata deve essere letta a partire dagli M bit di dati viene infatti generato un nuovo insieme di K bit di codice, che viene confrontato con i i bit del codice caricato, determinando tre diverse situazioni:
- non ci sono errori;
- scoperto un errore che può essere corretto;
- scoperto errore non correggibile.
Questi codici sono caratterizzati dal numero di bit di errore che può essere corretto.
Codice di Hamming
Considerando l'intersezione di tre cerchi, si ottengono sette diverse aree: si assegnano i 4 bit di dati alle sezioni più interne mentre nelle restanti sono inseriti i cosiddetti bit di parità, ognuno dei quali è scelto in modo tale che sia pari il numero totale di bit 1 in ogni cerchio. Il dispositivo logico per il confronto riceve in ingresso due valori a K bit ed esegue su di essi il confronto bit a bit utilizzando l'operazione di or esclusivo. Il risultato è detto parola sindrome ed ogni suo bit è 0 oppure 1 in base alla presenza o meno dello stesso bit nella corrispondente posizione delle due parole. La parola sindrome è lunga K bit ed ha un valore compreso tra 0 e 2^K - 1: il valore 0 indica che non è stato individuato nessun errore, mentre gli altri 2^K - 1 valori indicano, in caso di errore, quale bit è stato alterato. Un errore può essersi verificato su uno qualsiasi degli M bit di dati oppure dei K bit di controllo.
2^k - 1≥M+K: indica il numero di bit che sono necessari per correggere l'errore di un singolo bit in una parola che contiene M bit di dati. Si può verificare con una tabella che maggiore è il numero di bit di una parola di dato, minore è l’incidenza della ridondanza di controllo (se il numero di bit di dato raddoppia, quello di controllo cresce incrementandosi di 1)
La memoria a semiconduttore è dotata anche di un codice per l'individuazione di errori doppi che richiedono un bit aggiuntivo rispetto ai codici SEC. Viene aggiunto un ottavo bit che viene inizializzato in modo tale da avere un numero pari di 1 nel diagramma e riuscendo così a catturare l'errore.
Cache
L'uso della memoria cache ha lo scopo di dare alla memoria una velocità molto vicina a quella delle più veloci memorie disponibili e allo stesso tempo, di renderla di grandi dimensioni al costo della più economica memoria a semiconduttore. Quando il processore prova a leggere una parola in memoria, viene controllato se la parola si trova nella cache, nel qual caso viene consegnata direttamente al processore. In caso contrario, viene trasferita nella cache una porzione di memoria principale, formata da un numero fissato di parole, dopodiché la parola viene consegnata al processore. In questo modo si sfrutta il fenomeno della località dei riferimenti. Nel caso in cui si ha un successo (hit), ovvero la parola si trova in cache, vengono disattivati i due buffer e la comunicazione avviene solo tra il processore e la cache, escludendo transiti sul bus di sistema. Nel caso si ottiene un fallimento, l'indirizzo richiesto viene caricato sul bus di sistema ed i dati vengono restituiti, attraverso il buffer di dati, alla cache ed alla memoria principale.
Elementi di progettazione della cache
- dimensione: deve avere un costo medio per bit simile a quello della sola memoria principale, e grandi abbastanza da avere un tempo medio di accesso vicino a quello della sola cache.
- mapping function (funzione di corrispondenza): dato che vi sono meno linee di cache rispetto al numero di blocchi di memoria principale, sono necessari un algoritmo per far corrispondere blocchi di memoria a linee di cache ed un mezzo per determinare quale blocco di memoria sta occupando una determinata linea di cache.
- replacemente algorthm (algoritmi di rimpiazzamento): quando un nuovo blocco viene trasferito nella cache, uno dei blocchi memorizzati deve essere sostituito per fare posto al nuovo arrivato.
- write policy (politica di scrittura): prima di poter sostituire un blocco che si trova nella cache, è necessario controllare se è stato modificato nella cache ma non in memoria principale: in caso negativo il vecchio blocco può essere sovrascritto, in caso contrario la memoria principale deve essere aggiornata.
- block size (dimensione di linea): blocchi più grandi riducono il numero di blocchi che possono essere inseriti in cache. Poiché ogni blocco caricato sovrascrive il vecchio contenuto della cache, si ha che i dati vengono sovrascritti dopo poco che sono stati caricati; con il crescere delle dimensioni di un blocco, ogni parola aggiunta in cache è sempre più distante dalla parola effettivamente richiesta.
- numero di cache: sono possibili due configurazioni: una sola cache on chip; una cache on chip e una esterna. La prima ha una più alta percentuale di successo rispetto a cache divise, perché riesce a bilanciare automaticamente il proprio lavoro tra caricamento di istruzioni e caricamento di dati. E' quindi necessario progettare ed implementare una sola cache. La seconda elimina la contesa tra il processore dell'istruzione e l'unità di esecuzione, fattore fondamentale in un qualsiasi progetto che si basa sulla tecnica di pipeline delle istruzioni.
Tipi di funzioni di mapping
- direct mapping: associa ad ogni blocco di memoria principale una sola possibile linea di cache. E' molto semplice e poco costosa da implementare, ma il suo più grande difetto è il fatto che vi sia una locazione fissata di cache per ogni blocco (se un certo blocco è nella cache, può essere solo in una certa linea). Quindi se accedo a diversi indirizzi di memoria principale che possono stare solo nello stesso blocco di cache ho un alto numero di cancellazioni e riscritture nella cache. Un indirizzo viene visto come la sequenza di bit di tag (s-r, bit più significativi), di linee (r) e di word (w, bit meno significativi). Mediante il valore r di linee viene individuata l’unica linea di cache che potrebbe contenere il dato. Infatti l’indirizzo di memoria principale è più lungo di quello della cache, quindi ci sono più linee di memoria principale che possono finire in un certo indirizzo di cache (e che possono finire solo in quello). Ai bit meno significativi vengono tolti i bit di word e si ottiene così l’indirizzo della cache. A questo punto vengono confrontate la tag dell’indirizzo di memoria con la tag del blocco di cache; se coincidono, il dato si trova nella cache, e per recuperare una delle linee corrispondenti a quella tag viene usato il valore w. In caso contrario il dato viene pescato nella memoria principale.
- associative mapping: consente ad ogni blocco di memoria principale di essere caricato in una qualsiasi linea di cache; in questo caso, quindi, la logica di controllo della cache interpreta un indirizzo di memoria semplicemente come un tag ed un campo parola. Il tag identifica univocamente un blocco di memoria principale e per determinare se un blocco si trova nella cache, la logica di controllo della cache deve esaminare simultaneamente ogni tag di linea in cerca di una corrispondenza. Si ha una certa flessibilità nella scelta di quale blocco sostituire quando si deve trasferire in cache un nuovo blocco.
Svantaggio: complessa circuiteria richiesta per controllare i tag di tutte le linee della cache in parallelo. Quindi la tag di un indirizzo viene confrontata con tutte le tag della cache. Se una di queste coincide con l’originale, significa che l’informazione è nel relativo blocco della cache. L’informazione esatta è poi pescata nel blocco sulla base dei bit di word - set associative mapping: rappresenta un compromesso tra metodo diretto e associativo. Nei casi estremi si comporta o da associativa o da diretta. La cache viene divisa in set. Un certo blocco può essere mappato in ogni linea di un certo (univoco) set. L’indirizzo di memoria è pertanto formato da tag, set e word. Il valore set identifica quindi un insieme di blocchi in cui potrebbe trovarsi l’informazione. Quindi viene effettuato un compare di tipo associativo esclusivamente sui tag di quel set (e non su tutti come nel mapping associativo). Se c’è una corrispondenza, significa che il dato è nella cache e viene pescato usando la word relativamente al tag che corrispondeva.
Tipi di algoritmi di rimpiazzamento
- LRU (Least Recently Used): sostituisce il blocco che è stato per più tempo inutilizzato, poiché si suppone che le locazioni di memoria usate più recentemente sono anche quelle a cui si accederà con maggior probabilità, LRU dovrebbe permettere di ottenere la miglior percentuale di successo.
- FIFO: sostituisce il blocco che si trova nella cache da più tempo e che può essere implementato facilmente con tecniche come quella di round-robin o del buffer circolare.
- LFU (Least Frequently Used): sostituisce il blocco in cui si sono avuti meno accessi e che potrebbe essere implementato associando un contatore ad ogni linea.
- RANDOM: sceglie una linea in modo casuale tra tutte le varie candidate: studi di simulazione hanno mostrato come il rimpiazzamento casuale porti a prestazioni solo di poco inferiori rispetto agli algoritmi basati sull'utilizzo.
Tipi di write policy
- write through: prevede che tutte le operazioni di scrittura vengano eseguite sia in memoria principale che in cache, assicurando così la validità della memoria principale. Così facendo si genera però una grossa quantità di traffico verso la memoria creando, quindi, colli di bottiglia.
- write back: gli aggiornamenti sono eseguiti solo nella cache. Quando si fa un aggiornamento, viene impostato un bit UPDATE associato ad ogni linea, per cui quando viene sostituito un blocco, si ha una scrittura in memoria principale se e solo se il bit UPDATE ha valore 1.
Svantaggi: alcune parti di memoria principale non sono valide e quindi gli accessi da parte dei moduli di I/O possono essere permessi solo se attraversano la cache (maggior complessità della circuiteria ed eventuali colli di bottiglia).
Tipi di memorie possibili
- Dram avanzata (EDRAM): integra una piccola cache SRAM su un generico chip DRAM. Una versione a 4 Mbyte della EDRAM: la cache SRAM memorizza l'intero contenuto dell'ultima riga letta, formata da 2048 bit o da 512 gruppi di 4 bit. Un'unità di confronto memorizza il valore a 11 bit dell'indirizzo della riga più recente: se il prossimo accesso è alla stessa riga, è sufficiente accedere alla più veloce cache SRAM. Le operazioni di aggiornamento possono essere eseguite in parallelo alle operazioni di lettura nella cache.
- Dram con cache (CDRAM): La SRAM della CDRAM può essere usata come una cache vera e propria o come buffer per consentire l’accesso seriale di un blocco di dati.
- DRAM sincrona (SDRAM): scambia dati con il processore in modo sincronizzato con il segnale di un clock esterno e lavora alla velocità del bus processore/memoria senza imporre stati di attesa. la DRAM esegue alcune funzioni interne, come l'attivazione dell'alta capacità delle linee di riga e di colonna, il rilevamento dei dati e la trasmissione dei dati attraverso i buffer di uscita. Purtroppo, durante questo ritardo, il processore deve semplicemente aspettare, rallentando così il rendimento del sistema. ha un'architettura interna dual-bank che migliora l'utilizzo del parallelismo su chip.
- RAMBUS: chip RDRAM sono pacchetti verticali, dotati di piedini su un solo lato: il chip scambia dati con il processore su 28 fili elettrici non più lunghi di 12 centimetri, inoltre il bus può indirizzare fino a 320 RDRAM ed ha una velocità di 500 Mbps. Lo speciale bus di una RDRAM trasmette indirizzi ed informazioni di controllo utilizzando un protocollo asincrono orientato ai blocchi. Una RDRAM, invece di essere controllata dai segnali espliciti RAS, CAS, R/W e CE come accade nelle DRAM classiche, riceve attraverso un bus ad alta velocità una richiesta di memoria, che contiene l'indirizzo desiderato, il tipo di operazione ed il numero di byte dell'operazione stessa.
Memorie esterne
Disco magnetico
Il meccanismo di scrittura si basa sul fatto che un flusso di elettricità attraverso una spirale induce un campo magnetico. Vengono inviati degli impulsi di corrente sulla testina, che provocano la registrazione sulla superficie sottostante di configurazioni magnetiche. La lettura è molto simile solo che legge i campi magnetici presenti sul disco. La differenza tra 0 e 1 sta nella polarità del campo (alternata variando il verso della corrente). Una volta si usava la stessa testina per leggere e scrivere; oggi invece per la lettura si usa una testina più piccola costituita da un materiale che la rende un magnetoresistore (cioè con resistività variabile con il campo magnetico). Il valore è interpretato misurando la resistenza offerta dalla testina. Il principale vantaggio è che la testina di lettura può avere così dimensioni minori, quindi può essere posizionata più vicina alla superficie del disco, e quindi l’intensità di campo richiesta diminuisce.
Organizzazione
I dati sono organizzati sul disco in modo concentrico, come un insieme di anelli detti tracce; tracce adiacenti sono separate da intervalli vuoti (gap); su ogni traccia viene generalmente memorizzato lo stesso numero di bit, per cui la densità aumenta passando dalle tracce più esterne a quelle più interne (vantaggio: la testina si muove con la stessa velocità angolare; svantaggio: “spreco” delle aree che potrebbero avere maggiore densità. Un’alternativa è una struttura a zone: ogni traccia ha un # di settori crescente verso l’esterno); I dati sono trasferiti da e verso il disco in blocchi e sono memorizzati in aree di grandezza pari ad un blocco, dette settori; settori adiacenti sono separati con gap; su ogni traccia deve essere presente un punto di partenza e deve essere identificato l’inizio e la fine di un settore; in ogni traccia sono presenti dei bit di sincronizzazione (sequenze del tipo 01010101…) che permettono alla testina di valutare la densità dei bit
Caratteristiche fisiche
La testina può essere fissa oppure si può muovere lungo la direzione radiale del disco. In un disco a testina fissa è presente, per ogni traccia, una testina di lettura/scrittura fissata su un braccio rigido che si estende su tutte le tracce; in un disco a testina mobile vi è una sola testina di lettura/scrittura, che è ancora fissata ad un braccio, il quale può essere esteso o retratto in modo da consentire alla testina di essere posizionata sulle varie tracce. Il disco stesso si trova su un drive, che è formato da un braccio, un asse che fa ruotare il disco e da alcune componenti elettroniche per l'ingresso e l'uscita di dati binari. Inoltre il disco può essere a faccia singola o a faccia doppia (più diffusa), e anche a più livelli. Nei dischi interni non c’è contatto tra disco e testina: questa è sempre sollevata oppure, come nel caso dei dischi Winchester, si appoggia quando il braccio è fermo. Per potersi appoggiare però è richiesto un bassissimo tasso di impurità interne per non danneggiare il disco. Nei floppy invece la testina striscia. I dischi possono essere fissati o mobili
Parametri per comparare i dischi
Quando il drive del disco è operativo, il disco ruota a velocità costante, per leggere o scrivere, la testina deve essere posizionata sulla traccia corretta, all'inizio del settore desiderato. Selezionare una traccia significa spostare la testina oppure selezionarne elettronicamente una. Il tempo richiesto per posizionare la testina sulla traccia è detto
tempo di ricerca (seek time): ± esso è: T=m*ns: n=numero tracce attraversate; m=costante dipendente dal drive del disco; s= tempo per l’avviamento. Una volta che la traccia è stata selezionata, il controllore del disco aspetta fintanto che il settore corretto, ruotando, arrivi ad allinearsi con la testina stessa. Il tempo richiesto per quest'ultima operazione è detto
ritardo rotazionale (latency). La somma del tempo di ricerca e del ritardo rotazionale indica il
tempo di accesso. Un altro elemento da tener presente è il
tempo di trasferimento che dipende dalla velocità di rotazione: T=b/rN: b=num. Byte da trasferire; N=num. Byte su una traccia; r= velocità di rotazione.
RAID (Redundand Array of Independent Disks)
- è un insieme composto fisicamente da diversi drive che viene visto dal sistema operativo come un singolo driver logico
- i dati sono distribuiti attraverso i drive fisici di un vettore.
- lo spazio dedicato alla ridondanza viene utilizzato per memorizzare informazioni di parità, che permettono un recupero dei dati in caso di guasto dei dischi.
I dettagli relativi al secondo ed al terzo punto differiscono in base al livello di RAID considerato, mentre il RAID 0 non include la terza caratteristica. La strategia RAID sostituisce drive di dischi di grandi dimensioni con drive multipli di dimensioni più piccole e distribuisce i dati in triodo tale da permettere un accesso simultaneo ai dati dei diversi drive, migliorando nettamente le prestazioni di I/O e consentendo una più semplice modalità di incremento graduale delle capacità di memorizzazione. E' possibile l'uso di testine multiple e la possibilità di lavorare in parallelo permettono di raggiungere elevate velocità di I/O e di trasferimento, l'uso di dispositivi multipli rende maggiore la probabilità di errori. Per compensare questa perdita in affidabilità, RAID usa le informazioni di parità che sono state memorizzate, per recuperare dati persi in caso di guasto di un disco. I RAID sono usati tipicamente sui server. I livelli sono sostanzialmente 6 (+ il livello 0):
0) non c’è alcuna ridondanza;
1) c’è una copia completa dei dati;
2) c’è della ridondanza in codice Hamming dei dati originali memorizzata su alcuni dischi;
3) memorizzata parità di bit
in un singolo array;
4) memorizzata parità relativa a blocchi di bit;
5) parità di blocchi distribuita;
6) doppia ridondanza
Dispositivi ottici
CD-ROM (scritti in fase di produzione con delle
maschere), CD-R (scrivibili dall’utente una sola volta), CD-RW
(riscrivibili dall’utente). Una classificazione analoga vale per i DVD.
L’informazione è memorizzata sotto forma di buchi e lette con dei laser.
La densità di scrittura è costante. L’accesso alla memoria del cd-rom è
lento e difficile. Tuttavia i supporti ottici hanno numerosi vantaggi
dal punto di vista della capacità, robustezza, comodità, ecc. infine il
nastro magnetico è lento ma economico e dotato di buona capacità
Velocità CAV e CAL: un foro in prossimità del centro del disco ruota ad una velocità più bassa rispetto ad uno che si trova più esternamente, per cui bisogna compensare questa discrepanza in modo tale che il laser possa leggere tutti i fori alla stessa velocità. Così come avviene per i dischi magnetici, il problema può essere risolto aumentando lo spazio tra i bit registrati sui segmenti del disco: in questo modo le informazioni possono essere scandite ruotando il disco ad una velocità fissata, detta velocità angolare costante CAV. Lo svantaggio dell'uso di CAV è il notevole spreco di spazio. Sui CD le informazioni sono compattate in segmenti della stessa dimensione, che vengono scanditi alla stessa velocità facendo ruotare il disco a velocità variabile. In questa situazione, i fori sono letti dal laser ad una velocità lineare costante CLV.
Dispositivi di I/O
I moduli di I/O realizzano un'interfaccia con dei dispositivi esterni che possono essere leggibili dall’uomo (schermo), dal processore (dispositivi di controllo e di monitoraggio), oppure dispositivi di connessione (es modem).
Le funzioni che devono svolgere sono dunque:
- interfacciarsi con il processore o la memoria per mezzo del bus di sistema o di uno switch centrale (vedi modulo DMA)
- interfacciarsi con uno o più dispositivi o periferiche tramite collegamenti dedicati.
Le periferiche non vengono connesse direttamente al bus, bypassando i moduli di I/O, per le seguenti motivazioni:
- esiste una gran varietà di periferiche e di modalità operative, per cui non sarebbe conveniente integrare nel processore le funzionalità logiche necessarie per gestire un così vasto insieme di dispositivi;
- la velocità di trasferimento dei dati verso le periferiche è spesso molto più lenta che verso la memoria o verso il processore, per cui sarebbe scomodo impiegare il bus di sistema ad alta velocità per permettere una comunicazione diretta verso una periferica lenta;
- le periferiche usano spesso formati di dati e lunghezze di parole diverse da quelle usate nel calcolatore a cui sono collegate.
Struttura del dispositivo esterno
La struttura tipica di un dispositivo esterno è formata da :
- trasduttore/attuatore: nella fase di output converte i dati dalla forma elettrica ad altre forme di energia (attuatore); viceversa nella fase di input converte i segnali di altra natura provenienti dal mondo esterno in segnali elettrici interpretabili dal resto del sistema (trasduttore)
- buffer: di dimensione variabile, si interpone tra il trasduttore e il resto del sistema in modo che lo scambio dei dati in entrambe le direzioni avvenga su questa unità
- logica di controllo: controlla il comportamento del dispositivo a seguito dei comandi provenienti dal modulo di I/O e fornisce in risposta segnali di stato
Funzionamento del dispositivo esterno
L'interfaccia verso il modulo di I/O avviene sotto forma di:
- control signal: dal modulo di I/O, specificano la funzione che dovrà essere eseguita dal dispositivo;
- status signal: verso il modulo di I/O, informano sullo stato del dispositivo
- data: sequenza di bit inviata o ricevuta da un modulo di I/O
Struttura del modulo di I/O
Il modulo di I/O è collegato al resto del calcolatore attraverso un insieme di linee di segnale ed in cui i dati trasferiti da/verso il modulo sono memorizzati temporaneamente in uno o più registri di dati. Ci possono essere anche uno o più registri di stato.
I circuiti logici interni al modulo interagiscono con il processore per mezzo di un insieme di linee di controllo, che sono impiegate dal processore stesso per emettere comandi verso il modulo di I/O.
II modulo deve essere in grado di riconoscere e generare gli indirizzi associati ai dispositivi che controlla.
Il modulo di I/O contiene anche una logica specifica dell’interfaccia verso ogni dispositivo che controlla.
Funzioni e requisiti di un modulo di I/O
- controllo e temporizzazione: coordina il flusso di traffico tra le risorse interne ed i dispositivi esterni;
- comunicazione con il processore: composta da
- decodifica del comando: il modulo di I/O accetta comandi dal processore, generalmente inviati come segnali sul bus di controllo e li decodifica;
- dati: sono scambiati tra il processore ed il modulo di I/O attraverso il bus di dati;
- resoconto dello stato: è importante conoscere lo stato del modulo di I/O;
- riconoscimento dell'indirizzo: modulo di I/O deve conoscere l'indirizzo univoco di ogni periferica che controlla. - comunicare con il dispositivo: un modulo di I/O deve poter comunicare con i vari dispositivi a cui sovrintende.
- bufferizzazione dei dati: la velocità di trasferimento dei dati verso/dalla memoria
è alta, mentre per i dispositivi periferici è molto più
bassa quindi i dati provenienti dalla memoria principale inviati
ad un modulo di I/O devono essere memorizzati temporaneamente e poi
trasferiti al dispositivo periferico alla sua velocità. Il modulo di I/O deve quindi essere in grado di lavorare ad entrambe le velocità: quella del dispositivo ed a quella della memoria.
- rilevamento di errori: responsabile del rilevamento di errori e del loro successivo resoconto al processore.
Processo di I/O
- la CPU controlla lo stato del dispositivo attraverso il modulo di
I/O;
- il modulo di I/O comunica lo stato;
- se è pronto, la CPU richiede il trasferimento di dati;
- il
modulo di I/O chiede i dati alla periferica e poi li trasmette alla CPU
Si possono avere variazioni nella sequenza a seconda che sia abilitato/disponibile la funzionalità DMA.
Tipi di I/O
Ci sono tre tecniche principali di I/O:
- programmable I/O: i dati sono scambiati tra il modulo di I/O ed il processore, il quale esegue un programma che assume il controllo diretto dell'operazione di I/O, compreso il rilevamento dello stato del dispositivo, l'invio di un segnale di lettura o di scrittura ed il trasferimento di dati. Nel caso in cui il processore è più veloce del modulo, si ha un certo spreco di tempo (comunque la CPU può decidere se aspettare o tornare più tardi). Il processore deve aspettare affinché il modulo di I/O di interesse sia pronto per ricevere o trasmettere dati e deve interrogare ripetutamente lo stato del modulo, con il conseguente abbassamento del livello di rendimento.
- interrupt driver: il programma che emette il comando di I/O continua la sua esecuzione finché non è interrotto dall'hardware di I/O, che segnala la terminazione dell'operazione richiesta con opportuni segnali di interrupt.
Svantaggi: richiede l'intervento del processore per trasferire dati tra la memoria ed un modulo di I/O ed ogni trasferimento segue un percorso attraverso il processore stesso.
In entrambi i casi la velocità di trasferimento dell'I/O è limitata dalla velocità con cui il processore può controllare e servire un dispositivo.
Il processore è vincolato dalla gestione di un trasferimento di I/O; inoltre, per ognuno di questi, devono essere eseguite diverse istruzioni.
direct memori access DMA: prevede che il modulo di I/O e la memoria principale si scambino i dati in modo diretto, senza coinvolgere il processore. E' richiesto un ulteriore modulo sul bus di sistema, detto modulo DMA capace di simulare il processore e di subentrare ad esso nel controllo del sistema, nel caso di trasferimenti di dati da/verso la memoria attraverso il bus di sistema. Il modulo DMA deve usare il bus solo quando il processore non ne ha bisogno, oppure deve costringerlo a sospendere temporaneamente la sua attività. Il processore viene impiegato solo nella fase iniziale ed in quella finale del trasferimento.
Vantaggi: guadagna nel trasferimento di parole multiple.
Programma di I/O
Il programma di I/O è
formato da tre parti:
- sequenza di istruzioni per la preparazione
dell'operazione di I/O, che può comprendere la copiatura dei dati in
uno speciale buffer e la preparazione dei parametri per il comando del
dispositivo di uscita.
- il vero e proprio comando di I/O.
Se le
interruzioni non venissero usate, dopo l'emissione del comando, il
programma dovrebbe aspettare che il dispositivo di I/O abbia eseguito
la funzione richiesta, ripetendo un'operazione di
controllo per determinare se l'operazione è stata fatta. - una sequenza
di istruzioni per completare l'operazione, che può
comprendere l'inizializzazione di un flag indicante il successo oppure
il fallimento dell'esecuzione dell'operazione. Poiché un'operazione di
I/O può richiedere diverso tempo per essere completata, il programma di
I/O è costretto ad aspettare per la sua terminazione e, di conseguenza,
il programma utente viene fermato nel punto della chiamata per un
periodo di tempo piuttosto considerevole.
Solitamente ci sono più dispositivi di I/O collegati al sistema tramite moduli I/O quindi, quando il processore mette un comando di I/O, occorre specificare, nel comando stesso, l'indirizzo del dispositivo che si vuole comandare, in modo che questi sia in grado di sapere se è stato chiamato.
Con questo tipo di I/O il trasferimento di dati di I/O è molto simile all'acceso di dati in memoria.
Quando il processore, la memoria principale e il modulo di I/O condividono un bus comune (il bus di sistema) sono possibili due
modi di indirizzamento:
- memory mapped I/O: memoria e periferiche condividono un singolo spazio di indirizzi. Il processore considera i registri di stato e di dati dei moduli di I/O come locazioni di memoria ed usa le stesse istruzioni macchina per accedere sia alla memoria che ai vari dispositivi. Sono necessarie una sola linea di lettura ed una sola linea di scrittura.
- isolated I/O: per l'I/O si utilizza uno spazio di indirizzi separato dalla memoria. Il bus di sistema è allora dotato di linee di lettura e scrittura verso la memoria e in aggiunta linee per i comandi di input e di output. La linea di comando specifica ora se l'indirizzo si riferisce ad una locazione di memoria oppure ad un dispositivo di I/O e l'intero intervallo di indirizzi può essere dedicato ad entrambi.
2) Interrupt driver
Consente al processore di emettere un comando di I/O per un modulo e di proseguire con altre attività senza dover preoccuparsi di controllare periodicamente l'esito del comando.
Dal punto di vista del modulo I/O: in caso di un ingresso, il modulo riceve un comando di lettura (READ) dal processore e prosegue a leggere i dati da una periferica ad esso associata; una volta che i dati si trovano nel registro di dati del modulo, esso invia un segnale di interruzione al processore, attraverso una linea di controllo, ed aspetta che i dati siano richiesti dal processore. Quando viene fatta questa richiesta, il modulo pone i suoi dati sul bus di dati ed è di nuovo pronto per un'altra operazione di I/O.
Alla fine di ogni ciclo di istruzione, il processore controlla se si sono verificate delle interruzioni e, in caso affermativo, salva il contesto del programma in corso ed elabora l'interruzione. Svantaggi: continua a consumare molto tempo per l'elaborazione, dato che ogni parola di dati, che dalla memoria va verso il modulo di I/O e viceversa, passa attraverso il processore.
Problemi nella progettazione di I/O con interruzioni
- riconoscere quale dispositivo ha emesso l'interruzione:
- linee di interruzione multiple: il metodo più diretto è di fornire linee di interruzione multiple tra il processore ed i moduli di I/O (una per modulo), ma risulta scomodo dedicare più di qualche linea di bus o di qualche piedino del processore a queste linee
- software pool: viene interrogato in sequenza ogni modulo per determinare quale ha inviato la richiesta di interruzione. Si una un notevole spreco di tempo
- daisy chain: un'interrogazione (hw poll) via hardware: quando il processore riceve un'interruzione, invia indietro una specie di ricevuta, che si propaga attraverso la serie di moduli di I/O fintanto che non raggiunge un modulo che ha inviato la richiesta e che risponde ponendo una parola di riconoscimento sulla linea di dati;
- l'arbitraggio del bus: un modulo di I/O deve prima prendere il controllo del bus e poi utilizzare la linea di richiesta delle interruzioni, per cui un solo modulo alla volta può inviare richieste di interruzione.
- come decidere le priorità:
Le linee con priorità più alta possono interrompere quelle con priorità più bassa
- linee multiple: il processore sceglie la linea di interruzione con la priorità più alta;
- software pool e daisy chain: l'ordine in cui sono selezionati i vari moduli determina la loro priorità;
- l'arbitraggio del bus: può impiegare uno schema di priorità.
3) Fasi del DMA
Quando il processore desidera leggere o scrivere un blocco di dati, emette un comando indirizzato al modulo DMA, inviandogli le seguenti informazioni:
- il tipo di operazione richiesta (lettura/scrittura), usando la linea di controllo verso il DMA;
- l'indirizzo del dispositivo di I/O coinvolto, comunicato attraverso le linee di dati;
- la locazione di memoria a partire dalla quale si legge o si scrive, comunicata attraverso le linee di dati e memorizzata dal modulo DMA nel registro indirizzi;
- il numero di parole che devono essere lette o scritte, comunicato attraverso le linee di dati e memorizzato nel registro contatore parole;
Il processore prosegue con altre attività.
Quando il trasferimento è finito, il modulo DMA invia un segnale di interruzione al processore.
Caratteristiche canali di I/O
Il canale di I/O rappresenta un'estensione del concetto di DMA, in quanto può eseguire istruzioni di I/O e, quindi, ha un completo controllo delle operazioni di I/O.
Ci sono due tipi di canali di I/O:
- canale selettore: controlla diversi dispositivi ad alta velocità, e, in qualunque momento, si dedica al trasferimento di dati da/verso uno di questi dispositivi, per cui il canale di I/O seleziona un dispositivo ed esegue il trasferimento.
- canale multiplexer: può gestire contemporaneamente molti dispositivi. In particolare, in caso di dispositivi a bassa velocità, si usa un multiplexer di byte che accetta o trasmette caratteri, il più velocemente possibile, a tutti i dispositivi. Nel caso di dispositivi ad alta velocità, infine, si usa un multiplexer di blocchi, che intervalla i blocchi di dati recuperati dai diversi dispositivi.
Struttura e funzioni della CPU
Organizzazzione del processore
La CPU deve:
- caricare l'istruzione (fetch istruction FI): la CPU legge un'istruzione dalla memoria e la carica nell'IR;
- interpretare l'istruzione (decode istruction DI): l'istruzione viene decodificata per determinare l'azione richiesta;
- caricare i dati (fetch data FD): l'esecuzione di un'istruzione può richiedere la lettura di dati dalla memoria oppure da un modulo di I/O;
- elaborare i dati (process data PD): l'esecuzione di un'istruzione può richiedere l'esecuzione di alcune operazioni aritmetiche o logiche sui dati.
- scrivere i dati (write data WD): il risultato dell'esecuzione può richiedere la scrittura dei dati in memoria oppure in un modulo di I/O.
Le principali componenti della CPU sono:
- l'unità aritmetico -logica (ALU): esegue il calcolo o l'elaborazione effettiva dei dati;
- l'unità di controllo: controlla il movimento dei dati e delle
istruzioni dentro e fuori la CPU e le operazioni della ALU.
- una memoria interna: piccola, composta da un insieme di locazioni di
memoria chiamate registri
- bus interno: bus necessario per trasferire dati tra i vari registri e la ALU.
Tipi di registri
- registri visibili all’utente
Possono essere suddivisi nelle seguenti categorie:
- general-purpose: possono essere assegnate dal programmatore per espletare diverse funzionalità. Ogni registro general-purpose può contenere l'operando per qualsiasi codice operativo.
- data register: possono essere utilizzati soltanto per contenere dati e non possono essere impiegati nel calcolo dell'indirizzo di un operando.
- address register: possono essere loro stessi registri general-purpose o possono
essere dedicati a particolari modalità di indirizzamento.
- condition codes: (flag) bit impostati dall’hardware della CPU come
risultato di un operazione.
- registri di controllo e di stato
Sono registri utilizzati per controllare le operazioni della CPU e
molti di essi non sono visibili all’utente.
Macchine diverse avranno
una diversa organizzazione dei registri.
I registri sono essenziali per l'esecuzione di un'istruzione
- Program Counter PC: contiene l'indirizzo dell'istruzione che deve essere prelevata
- Istruction Register IR: contiene l'istruzione appena caricata
- Memory Address Register MAR: contiene l'indirizzo di una locazione di memoria
- Memory Buffer Register MBR: contiene una parola di dati che deve essere scritta in memoria oppure quella letta più recentemente
- Program Status Word PSW: contiene i codici di condizione più altre informazioni sullo stato
Funzionamento
Tipicamente,
il PC è aggiornato dalla CPU dopo ogni prelievo di istruzione oppure
dopo un'operazione di diramazione o di salto così da puntare sempre
alla prossima istruzione da eseguire. L'istruzione prelevata viene caricata in IR dove vengono analizzati il codice operativo e gli specificatori degli operandi, mentre i dati sono scambiati con la memoria usando i registri MAR e MBR.
Nei sistemi organizzati con bus, MAR è connesso direttamente al bus di indirizzi, mentre MBR è connesso direttamente al bus di dati ed i registri visibili all'utente, a turno, scambiano i dati con MBR.
Fasi di un ciclo di istruzione
- ciclo di fetch
- istruction fetch
Il PC contiene l'indirizzo della prossima
istruzione che deve essere caricata. L'indirizzo viene allora trasferito in MAR e
quindi posto sul bus degli indirizzi; L'unità di controllo richiede una
lettura in memoria ed il risultato viene posto nel bus di dati e copiato nel registro MBR, per poi essere trasferito nel registro IR. Il PC viene infine incrementato di un'unità in preparazione del prossimo caricamento.
Una volta che il ciclo di prelievo è completato, l'unità di controllo esamina il contenuto di IR per determinare se contiene uno specificatore di operando che fa uso di indirizzamento indiretto e in tal caso esegue un ciclo di indirizzamento indiretto- data fetch
L'unità di controllo esaminato il contenuto di IR e dedotto che si tratta di un operando prende gli N bit più a destra del registro MBR (presi nella fase precedente), che contengono l'indirizzo del riferimento, e li trasferisce in MAR dopodiché l'unità di controllo richiede un accesso alla memoria per prelevare l'indirizzo dell'operando desiderato che verrà memorizzato in MBR.
- ciclo di execute
Dipende dal tipo di istruzione macchina che si trova nel registro IR.
Questo ciclo può richiedere il trasferimento dei dati tra registri, la lettura o la scrittura in memoria oppure in I/O e l'invocazione della ALU. - ciclo di interrupt
In caso di interruzioni il contenuto attuale del PC dee essere salvato così che la CPU possa riprendere la sua attività normale dopo l'interruzione. Il contenuto del PC viene allora trasferito nel registro MBR e poi scritto in memoria e la locazione di memoria speciale riservata a questo scopo è caricata dall'unità di controllo in MAR successivamente il PC è aggiornato con l'indirizzo della procedura di gestione delle interruzioni.
Pipeline
Prefetch
In genere l’esecuzione di una istruzione non prevede l’accesso alla memoria, quindi questa può essere interpellata per pre-caricare l’istruzione successiva in contemporanea all’esecuzione dell’istruzione attuale. Così facendo miglioro le prestazioni, anche se non le raddoppio poiché la fase di fetch richiede tempo minore rispetto all’esecuzione e quindi non risparmio una grande percentuale di tempo. Tuttavia nasce un problema ogni volta che si presenta una diramazione (
branch) (es un salto) in quanto l’istruzione pre-caricata non è davvero l’istruzione successiva che deve eseguire il processore, quindi il dato non è valido.
Per incrementare ulteriormente le prestazioni si può realizzare una
pipeline cioè una "catena di montaggio"
Pipeline
Consiste nel frazionare il ciclo di istruzione in un numero di fasi che occorrono in sequenza, come il caricamento dell'istruzione, la decodifica di questa, la determinazione degli indirizzi degli operandi, il caricamento degli operandi, l'esecuzione dell'istruzione e la scrittura del risultato nell'apposito operando.
Le istruzioni si muovono attraverso queste fasi come in una catena di montaggio, così che, in linea di principio, ogni fase può lavorare su un'istruzione diversa nello stesso tempo.
Le istruzioni di controllo del flusso e le dipendenze tra le istruzioni complicano la progettazione e l'utilizzo della pipeline.
SVANTAGGI: Un'istruzione di salto condizionato fa sì che l'indirizzo della prossima istruzione da prelevare sia sconosciuto, cosicché la fase di prelievo deve aspettare che la fase di esecuzione renda disponibile l'indirizzo della prossima istruzione.
Può sembrare che maggiore è il numero di fasi che appaiono nella pipeline, maggiore è la velocità di esecuzione invece:
- in ogni fase della pipeline c'è bisogno di elaborazioni aggiuntive per spostare dati da buffer a buffer e per eseguire varie funzioni di preparazione e distribuzione. Queste elaborazioni aggiuntive possono allungare il tempo totale di esecuzione di una singola istruzione (che diventa significativo quando le istruzioni in sequenza sono logicamente dipendenti, quando vi è un uso pesante di istruzioni di salto oppure quando vi sono molti accessi in memoria)
- la quantità logica di controllo richiesta per gestire le dipendenze della memoria e dai registri e per ottimizzare l'utilizzo della pipeline aumenta enormemente al crescere del numero di fasi
Per essere “produttivo” il numero di fasi della pipeline deve essere compreso tra 6 e 9.
Gestione dei salti
Ci sono diversi approcci:
- multiple streams: una pipeline semplice subisce una penalizzazione dalle istruzioni di salto in quanto deve scegliere la prossima istruzione da prelevare dalla memoria tra due istruzioni. Viene allora replicata la porzione iniziale della pipeline e viene permesso alla pipeline di caricare entrambe le istruzioni facendo uso di due flussi di dati.
Svantaggi: tardi dovuti agli accessi contemporanei alla memoria ed ai registri. Istruzioni di salto addizionali possono entrare nella pipeline prima che l'istruzione di salto originale sia stata risolta. - prefetch branch target: quando si raggiunge un'istruzione di salto condizionato, oltre all'istruzione che segue il salto, viene prelevata anche l'istruzione che corrisponde alla diramazione. Questa istruzione è quindi salvata finché viene eseguita l'operazione di salto e, se viene presa la diramazione, essa risulta essere già prelevata.
- loop buffer: una piccola memoria ad elevata velocità conservata dalla fase di prelievo dell'istruzione della pipeline e contenente le n istruzioni prelevate più recentemente in sequenza. Se viene eseguita una diramazione, l'hardware controlla se l'istruzione che corrisponde alla diramazione si trova all'interno del buffer se così è, viene prelevata dal buffer stesso.
- branch prediction: Sono molte le tecniche usate:
- supporre che il salto non avvenga mai o sempre: continuando a prelevare le istruzioni in sequenza oppure prelevando sempre l'istruzione corrispondente al salto (target).
- indovinare in base al codice operativo basato sul codice operativo dell'istruzione di controllo del flusso (alcuni codici c’è il salto altri no)
- utilizzare degli switch: possono essere associati uno o più bit ad ogni istruzione di salto condizionato, che riflettono la storia recente dell’istruzione
- usare una tabella della storia dei salti: è una piccola memoria cache associata alla fase di prelievo dell'istruzione della pipeline. Ogni entrata nella tabella è composta da tre elementi: l'indirizzo dell'istruzione di salto, alcuni bit di storia che registrano lo stato di utilizzo dell'istruzione e le informazioni relative all'istruzione corrispondente al salto. Nella maggior parte delle proposte questo terzo campo contiene l'indirizzo dell'istruzione a cui eventualmente saltare.
- delayed branching: è possibile riorganizzare automaticamente le istruzioni all’interno di un programma così che le istruzioni di salto condizionato occorrano più tardi del momento stabilito.
Il processore 80486 implementa una pipeline in cinque fasi:
- Prelievo: le istruzioni sono prelevate dalla cache oppure dalla memoria esterna e poste all'interno di uno dei due buffer di prelevamento anticipato a 16 byte
- Fase di decodifica 1: sia il codice operativo che la modalità di indirizzamento vengono decodificati.
- Fase di decodifica 2: la fase D2 espande ogni codice operativo nei segnali di controllo per la ALU.
- Esecuzione: include le operazioni della ALU, l'accesso alla cache e l'aggiornamento dei registri.
- Scrittura: aggiorna i registri ed i flag di stato modificati durante la fase di esecuzione precedente.
63) ORGANIZZAZIONE REGISTRI PENTIUM: Generale: vi sono otto registri a 32 bit general-purpose che possono essere utilizzati per tutti i tipi di istruzioni del Pentium II e che possono anche contenere operandi per il calcolo degli indirizzi alcuni di questi registri hanno funzioni particolari. Segmento: 16 registri a 16 bit contengono selettori di segmento, che indicizzano le tabelle di segmenti. Il registro di segmento di codice (CS) si riferisce al segmento contenente l'istruzione che si sta eseguendo; il registro di segmento di pila (SS) si riferisce al segmento contenente una pila visibile all'utente. Flag: contiene i codici di condizione e vari bit di modalità. Puntatore ad istruzione: contiene l’indirizzo dell’istruzione corrente.
64) REGISTRI MMX PENTIUM: le risorse MMX del Pentium II fanno sì che il processore possa utilizzare diversi tipi di dati a 64 bit. Le istruzioni MMX utilizzano campi a 3 bit di indirizzo di registri così che sono supportati otto registri MMX. per creare gli otto registri MMX sono utilizzati i 64 bit di ordine inferiore di ogni registro in virgola mobile: in questo modo, l'architettura esistente del Pentium Il è facilmente estesa così da supportare le capacità MMX. I registri in virgola mobile sono trattati come una pila mentre, per le operazioni MMX, sono resi accessibili in modo diretto. La prima volta che viene eseguita un'operazione MMX il tag FP è marcato come valido: ciò riflette il passaggio da indirizzamento mediante pila ad indirizzamento diretto mediante registro. L'istruzione EMMS svuota lo stato MMX, imposta i bit del tag FT in modo da indicare che tutti i registri sono vuoti. Quando è scritto un valore in un registro MMX, i bit del corrispondente registro FP sono impostati ad uno: se il valore nel registro FP è visto come un numero in virgola mobile, allora il valore corrispondente è NaN oppure infinito, assicurando che un dato MMX non possa sembrare un valore in virgola mobile valido.
65) INTERRUZIONI ED ECCEZIONI PENTIUM: Due classi di eventi causano la sospensione dell'esecuzione dell'attuale flusso di istruzioni Un'interruzione è generata da un segnale dell'hardware e può avvenire in un momento qualsiasi nel corso dell'esecuzione di un programma. Un'eccezione è generata dal software ed è provocata dall'esecuzione di un'istruzione. Interruzioni mascherabili: ricevute sul piedino INTR del processore. Il processore non riconosce un'interruzione mascherabile a meno che non sia impostato il flag di abilitazione delle interruzioni (IF). Interruzioni non mascherabili: ricevute sul piedino NMI del processore. Il riconoscimento di queste interruzioni non può essere evitato. Eccezioni individuate dal processore: avvengono quando il processore incontra un errore mentre prova ad eseguire un'istruzione. Eccezioni programmate: queste sono causate da istruzioni che generano un'eccezione.
66) TABELLA DELLE INTERRUZIONI PENTIUM: ad ogni tipo di interruzione viene assegnato un numero usato per indicizzare tale tabella, la quale contiene 256 entrate a 32 bit, ognuna delle quali, a sua volta, contiene l'indirizzo della procedura di servizio associata a quell'interruzione. la priorità tra interruzioni ed eccezioni è organizzata in cinque classi che sono: Classe 1: trap sulla precedente istruzione Classe 2: interruzioni esterne. Classe 3: errori causati dal prelievo della prossima istruzione. Classe 4: errori causati dalla decodifica della prossima istruzione. Classe 5: errori causati dall'esecuzione di un'istruzione.
67) TRATTAMENTO DELLE INTERRUZIONI PENTIUM: il trasferimento alla procedura di gestione delle interruzioni utilizza una pila di sistema per memorizzare lo stato del processore. Quando avviene un'interruzione e questa è riconosciuta dal processore, si susseguono una serie di eventi:1) Se il trasferimento richiede un cambiamento del livello di privilegio, sono inseriti nella pila il registro di segmento della pila e l'attuale registro contenente il puntatore alla pila estesa (ESP). 2) 1 valori attuali del registro EFLAGS sono inseriti nella pila. 3) Sia il flag di interruzione che il flag di trap vengono azzerati. 4) L'attuale puntatore al segmento di codice e l'attuale puntatore all'istruzione sono inseriti nella pila. 5) Se l'interruzione è accompagnata da un codice di errore, allora il codice di errore viene inserito nella pila. 6) Il contenuto della tabella delle interruzioni viene prelevato e caricato nei registri CS e IP oppure EIP L'esecuzione continua con la procedura di gestione dell'interruzione. La routine di gestione dell'interruzione esegue l'istruzione IRET per terminare il suo compito: questo causa il ripristino di tutti i valori salvati sulla pila ed il ripristino dell'esecuzione del processo interrotto dal punto in cui si era verificata l'interruzione.
68) PCI TRASFERIMENTO DI DATI: 1) Una volta che il master ha preso il controllo del bus, può iniziare la transazione attivando FRAME, ovvero la linea che resta operante fintanto che il mittente ha completato l'ultima fase di invio di dati. 2) All'inizio del secondo ciclo di clock, il destinatario riconoscerà il suo indirizzo sulle linee AD. 3) Il mittente smette di condurre il bus AD. Successivamente si richiede un ciclo completo su tutte le linee di segnale che possono essere utilizzate da più di un dispositivo, in modo tale che la discesa del segnale di indirizzo permetta la preparazione del bus in vista dell'utilizzo da parte del dispositivo destinatario. Il mittente, a questo punto, modifica le informazioni che si trovano sulle linee C/BE per indicare quali sono le linee AD che dovranno essere usate per il trasferimento dei dati indirizzati. Infine, attiva la linea IRDY per indicare che è pronto per l'invio del primo blocco di dati. 4) Il destinatario attiva la linea DEVSEL per indicare che ha riconosciuto come suo l'indirizzo quindi pone i dati richiesti sulle linee AD ed attiva TRDY per segnalare la presenza di dati validi sul bus. 5) Il mittente legge i dati all'inizio del quarto ciclo di clock e modifica le linee abilitate all'invio di byte. 6) In questo esempio, il destinatario disattiva TRDY per segnalare al destinatario che durante il ciclo che sta per iniziare non saranno inviati nuovi dati. Il blocco di dati viene letto all'inizio del sesto cielo di clock. 7) Durante il ciclo di clock numero 6, il destinatario inserisce il terzo blocco di dati sul bus. In questo esempio ha il buffer temporaneo pieno disattiva IRDY, mettendo il destinatario nella condizione di mantenere il terzo blocco di dati sul bus per un ulteriore ciclo di clock. 8) Il mittente sa che il terzo trasferimento di dati è l'ultimo, così disattiva FRAME per segnalare questa situazione al destinatario, e riattiva IRDY per indicare che è pronto a concludere l'invio. 9) Infine, il mittente disattiva RDY, riportando il bus nello stato di attesa, mentre il destinatario riattiva TRDY e DEVSEL.
Architettura 8086/88
Caratteristiche generali
tecnologia HMOS;
29,000 transistor; 40 pin; 2 pin di gnd; Vcc = 5V unica; fclock = 5 – 10 MHz; capacità indirizzamento 2^20=1Mbyte; (16 dei 20 pin di adr fungono anche da pin di dato)
Architettura interna
Register
1) Data register: utilizzati per memorizzare operandi e risultati delle operazioni; usati come reg a 16 bit (AX) oppure come coppie di reg a 8 bit (AH,AL)
AX Accumulator Register
BX Base Register utilizzato anche nel calcolo degli adr
CX Count Register utilizzato cm contatore in alcune istr (LOOP)
DX Data Register contiene adr di I/O in alcune istr di I/O
2) Pointers
IP Istruction Pointer puntatore alla prima istr da eseguire
SP Stack Pointer puntatore alla testa dello stack (stack: area di memoria organizzata a LIFO: è una pila)
BP Base Pointer base x fare accesso all'interno dello stack
SI Source Index utilizzati come registri indice
DI Destination Index
3) Segment Register: utilizzati per costruire gli adr fisici con i quali fare accesso in memoria
CS code segment puntatore all'inizio del segmento di codice
DS data segment puntatore all'inizio del segmento di dato
ES puntatore all'inizio del segmento di dato supplementare
SS stack segment puntatore all'inizio del segmento di stack
Process Status Word (PSW)
E' costituita da 16bit di cui solo 9 vengono utilizzati: flag
1) Flag di condizione (6): automaticamente scritti al termine di determinate op
SF Signal Flag MSB del risultato dopo una op aritmetica
ZF Zero Flag 0 se il risultato è nullo
PF Parity Flag 1 se gli 1 negli 8 bit meno significativi sn pari
CF Carry Flag 1 se c'è stato riporto o prestito. uso particolare x istr nn aritmentiche
AF Auxiliary CF usando nell'aritmentica BCD: 1 se c'è stato riporto o prestito
OF Overflow Flag 1 se l'ultima istr ha prodotto overflow
2) Flag di controllo (3): possono venir scritti e manipolati da apposite istr, regolano il funzionamento di alcune funz del processore
DF Direction Flag utilizzato nella manipolazione di str; 1: le str vengono manipolate a partire dai caratteri caratterizzati da adr maggiore
IF Interrupt Flag 1: i segnali di interrupt mascherabili vengono percepiti dalla CPU
TF Trap Flag 1: viene eseguita una trap al termine di ogni op
Execution Unit
Provvede alla decodifica e all'esecuzione delle istr.
Riceve byte per byte le istruzioni dalla BIU, le decodifica, genera gli indirizzi degli operandi (se necessario), li passa alla BIU; una volta ricevuti tutti gli operandi esegue l'istruzione, testa ed aggiorna i flag.
Bus Interface Unit
Gestisce tutte le op da e per l'esterno. (fetch istr, lettura/scrittura operandi e risultati istr, generazione adr, accodamento istr)
Calcolo degli indirizzi
Ogni volta che l'8086 deve generare un indirizzo da mettere sull'A-Bus (phisical address) esegue un'operazione di somma tra il contenuto di un registro puntatore oppure BX ed il contenuto di un registro di segmento moltiplicato per 16 (shift di 4 posizioni) ottenendo così un indirizzo a 20 bit.
Organizzazione della memoria
La memoria è organizzata in
segmenti ognuno di dimensione pari a 64 Kbyte. Tutti i segmenti cominciano a multipli di 16.
I gruppi di 16 byte che iniziano ad indirizzi multipli di 16 si definiscono
paragrafi. La memoria è quindi organizzata in paragrafi.
VANTAGGI DELLA SEGMENTAZIONE
Spazio di indirizzamento pari a 2^20, ma indirizzi su 16 bit.
Separazione tra dati, codice e stack
Possibilità di avere più segmenti dello stesso tipo (dati, codice o stack)
Possibilità di sovrapposizione tra i segmenti, con minimizzazione della memoria sprecata
Rilocabilità