1. Componenti di un elaboratore
  2. Elaborazione di una istruzione
  3. Interruzioni
    1. Interruzioni multiple approcci
  4. Struttura di interconnessione
    1. Funzionamento del bus
    2. Arbitraggio del bus
    3. Temporizzazione del bus
    4. Architettura del bus
    5. Architettura bus ad alte prestazioni
    6. Bus PCI
  5. Memorie
    1. La cella di memoria
    2. Caratteristiche
    3. Metodi di accesso:
    4. Parametri per valutare le prestazioni di una memoria
    5. Gerarchia delle memorie
    6. Tipi di memoria
    7. Organizzazione della RAM
    8. Tipi di errori e codici di correzione
    9. Codice di Hamming
  6. Cache
    1. Elementi di progettazione della cache
    2. Tipi di funzioni di mapping
    3. Tipi di algoritmi di rimpiazzamento
    4. Tipi di write policy
    5. Tipi di memorie possibili
  7. Memorie esterne
    1. Disco magnetico
    2. Organizzazione
    3. Caratteristiche fisiche
    4. Parametri per comparare i dischi
    5. RAID (Redundand Array of Independent Disks)
    6. Dispositivi ottici
  8. Dispositivi di I/O
    1. Struttura del dispositivo esterno
    2. Funzionamento del dispositivo esterno
    3. Struttura del modulo di I/O
    4. Funzioni e requisiti di un modulo di I/O
    5. Processo di I/O
    6. Tipi di I/O
    7. Programma di I/O
    8. 2) Interrupt driver
    9. 3) Fasi del DMA
  9. Struttura e funzioni della CPU
    1. Organizzazzione del processore
    2. Tipi di registri
    3. Funzionamento
    4. Fasi di un ciclo di istruzione
    5. Pipeline
    6. Prefetch
    7. Pipeline
    8. Gestione dei salti
  10. Architettura 8086/88
    1. Caratteristiche generali
    2. Architettura interna
    3. Register
    4. Process Status Word (PSW)
    5. Execution Unit
    6. Bus Interface Unit
    7. Calcolo degli indirizzi
    8. Organizzazione della memoria

Componenti di un elaboratore

  1. un'unita aritmetico-logica (ALU) in grado di eseguire semplici operazioni algebriche e logiche;
  2. 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;
  3. un sistema di ingresso (modulo di input) per acquisire dati dall'esterno;
  4. un sistema di uscita (modulo di output) per comunicare all'esterno i dati dell'elaborazione;
  5. 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:
  1. 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.
  2. 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)
  3. 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:
  1. 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;
  2. assegna al PC l'adr di partenza della procedura di gestione dell'interrupt;
  3. 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;
  4. 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.
  1. 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.
  2. 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:
  1. 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.
  2. 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.
  3. 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:
  1. arbitraggio
  2. sincronizzazione
  3. 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):
  1. 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).
  2. 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.
  3. 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:
  1. 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
  2. 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:
  1. ottenere l'uso del bus mediante arbitraggio;
  2. trasferire i dati attraverso di esso (bus dati).
Se invece un modulo deve richiedere dati ad un altro modulo deve allora:
  1. ottenere l'uso del bus mediante arbitraggio;
  2. trasferire una richiesta all'altro sulle linee di controllo e di indirizzo appropriate
  3. 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:
  1. centralized arbitration: Un solo dispositivo hw detto bus controller o arbiter è responsabile dell'allocazione temporale del bus.
  2. 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.
  1. 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.
  2. 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:
  1. 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;
  2. 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.

Caratteristicheda mettere a posto! -PaceyIV 6/28/07 2:36 PM 

Caratteristiche fisiche
In base alla persistenza o meno dei dati in assenza di alimentazione

Localizzazione:
Capacità:

Metodi di accesso:

Parametri per valutare le prestazioni di una memoria

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:
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:
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

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:

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:
  1. non ci sono errori;
  2. scoperto un errore che può essere corretto;
  3. 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

Tipi di funzioni di mapping

Tipi di algoritmi di rimpiazzamento

Tipi di write policy

Tipi di memorie possibili

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 adia­centi 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 ruota­re 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 ope­razione è 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)

  1. è un insieme composto fisicamente da diversi drive che viene visto dal sistema operativo come un singolo driver logico
  2. i dati sono distribuiti attraverso i drive fisici di un vettore.
  3. 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 mul­tipli 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 possibi­lità 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 scandi­te 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:

Le periferiche non vengono connesse direttamente al bus, bypassando i moduli di I/O, per le seguenti motivazioni:

Struttura del dispositivo esterno

La struttura tipica di un dispositivo esterno è formata da :

Funzionamento del dispositivo esterno

L'interfaccia verso il modulo di I/O avviene sotto forma di:




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 inte­ragiscono 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


Processo di I/O

  1. la CPU controlla lo stato del dispositivo attraverso il modulo di I/O;
  2. il modulo di I/O comunica lo stato;
  3. se è pronto, la CPU richiede il trasferimento di dati;
  4. 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:

  1. 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.
  2. 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 attra­verso 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:

  1. 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.
  2. 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.
  3. 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:
  1. memory mapped I/O: memoria e periferiche condividono un singolo spazio di indirizzi. Il processore consi­dera 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.
  2. 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 proces­sore, attraverso una linea di controllo, ed aspetta che i dati siano richiesti dal processo­re. 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

  1. riconoscere quale dispositivo ha emesso l'interruzione:
  1. come decidere le priorità:
    Le linee con priorità più alta possono interrompere quelle con priorità più bassa


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:

  1. il tipo di operazione richiesta (lettura/scrittura), usando la linea di controllo verso il DMA;
  2. l'indirizzo del dispositivo di I/O coinvolto, comunicato attraverso le linee di dati;
  3. 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;
  4. 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ò ese­guire istruzioni di I/O e, quindi, ha un completo controllo delle operazioni di I/O.
Ci sono due tipi di canali di I/O:
  1. 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.
  2. 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:
  1. caricare l'istruzione (fetch istruction FI): la CPU legge un'istruzione dalla memoria e la carica nell'IR;
  2. interpretare l'istruzione (decode istruction DI): l'istruzione viene decodificata per determinare l'azione richiesta;
  3. 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;
  4. elaborare i dati (process data PD): l'esecuzione di un'istruzione può richiedere l'esecuzione di alcune operazioni aritmetiche o logiche sui dati.
  5. 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:

Tipi di registri

  1. registri visibili all’utente
    Possono essere suddivisi nelle seguenti categorie:
    1. general-purpose: possono essere assegnate dal programmatore per espletare diverse funzionalità. Ogni registro general-purpose può contenere l'operando per qualsiasi codice operativo.
    2. data register: possono essere utilizzati soltanto per contenere dati e non possono essere impiegati nel calcolo dell'indirizzo di un ope­rando.
    3. address register: possono essere loro stessi registri general-purpose o posso­no essere dedicati a particolari modalità di indirizzamento.
    4. condition codes: (flag) bit impostati dall’hardware della CPU come risultato di un operazione.
  2. 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
  1. Program Counter PC: contiene l'indirizzo dell'istruzione che deve essere prelevata
  2. Istruction Register IR: contiene l'istruzione appena caricata
  3. Memory Address Register MAR: contiene l'indirizzo di una locazione di memoria
  4. Memory Buffer Register MBR: contiene una parola di dati che deve essere scritta in memoria oppure quella letta più recentemente
  5. 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

  1. 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.
  2. 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.
  3. 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:

  1. 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)
  2. 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:
 

Il processore 80486 implementa una pipeline in cinque fasi:
  1. 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
  2. Fase di decodifica 1: sia il codice operativo che la modalità di indirizzamento vengono decodificati.
  3. Fase di decodifica 2: la fase D2 espande ogni codice operativo nei segnali di controllo per la ALU.
  4. Esecuzione: include le operazioni della ALU, l'accesso alla cache e l'aggiornamento dei registri.
  5. 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 pro­cessore 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 utiliz­zati 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 regi­stro 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 rico­noscimento 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 puntato­re 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 com­pletato 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 disposi­tivo 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 è pron­to 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à