Estratto del documento

Architettura degli elaboratori

Strutturazione a livelli

Le funzionalità di un sistema di elaborazione nel suo complesso possono essere viste come ripartite secondo un certo numero di livelli, o macchine virtuali {MV0, MV1, ..., MVn}. Ogni livello è caratterizzato da:

  • Un insieme Ri di risorse, oggetti visibili a chi programma a quel livello;
  • Un linguaggio Li per il controllo e la gestione degli elementi di Ri.

Il livello MV0 è quello di componenti fisici a partire dai quali viene costruita un’astrazione. Il livello MVn è quello che possiamo chiamare delle “applicazioni” in quanto fornisce la visione degli oggetti e degli strumenti mediante i quali il sistema viene utilizzato dall’esterno. Il livello MV0, e solo quello, viene detto della macchina hardware. I livelli sono ordinati secondo una relazione gerarchica. Ogni istruzione primitiva o meccanismo del linguaggio Li è implementata da un programma Pi, scritto nel linguaggio Li. Il concetto che sta alla base della struttura a livelli è che per ogni livello MVi l’insieme dei livelli MVj permette di implementare complessivamente il supporto a tempo di esecuzione (STE) di Li, cioè una collezione di algoritmi e strutture dati che provvedono all’interpretazione dei meccanismi di Li.

Al livello MV1, della macchina firmware, è interpretato direttamente dall’hardware. A questo livello viene data la descrizione tanto del funzionamento interno di ogni unità di elaborazione quanto di quello di più unità interagenti. La macchina hardware viene virtualizzata mediante un insieme di microprogrammi, cioè sequenze di operazioni di trasferimento tra registri. Il livello MV2 è indicato erroneamente come macchina assembler. In effetti, il linguaggio L2 è un sottoinsieme di un linguaggio assembler.

Livello delle applicazioni e sistema operativo

MV4: Livello delle applicazioni
MV3: Sistema operativo
MV2: Macchina assembler
MV1: Macchina firmware

Il livello MV3, del sistema operativo, provvede a gestire le risorse fondamentali del sistema nei confronti dei programmi applicativi.

  • MV3.2: Funzione di supervisione
  • MV3.1: Gestione risorse fondamentali
  • MV3.0: Gestione dei processi

Il livello MV3.0, detto nucleo del sistema operativo, provvede alla gestione del processore nei confronti di attività concorrenti sia di utente che di sistema. Al livello MV3.1 ha luogo la gestione delle altre risorse fondamentali, su richiesta delle funzionalità attive al livello MV3.2, usando i meccanismi implementati da MV3.0. Il livello MV3.2 costituisce l’interfaccia nei confronti delle applicazioni.

La memoria virtuale

All'inizio dell'era dei calcolatori, le memorie erano piccole e care. In quei giorni i programmatori passavano il loro tempo cercando di comprimere i programmi in memorie piccolissime. Spesso era necessario usare un algoritmo che lavorava molto più lentamente di un altro semplicemente perché il migliore era troppo grande, cioè il programma che usava l'algoritmo migliore non stava nella memoria del calcolatore. La soluzione tradizionale a questo problema era di usare una memoria secondaria, come un disco. Il programmatore divideva il programma in pezzi chiamati overlay ognuno dei quali poteva stare in memoria. Per eseguire il programma si inseriva il primo overlay e lo si eseguiva; quando era finito leggeva l'overlay successivo e lo chiamava, ecc. Il programmatore era responsabile della divisione del programma in overlay, e doveva decidere dove dovesse essere tenuto ogni overlay nella memoria secondaria, curare gli spostamenti degli overlay tra memoria centrale e memoria secondaria e in generale gestire tutta l'elaborazione degli overlay senza alcun aiuto dal calcolatore.

Anche se usata per anni questa tecnica richiedeva molto lavoro in relazione alla gestione degli overlay. Un gruppo di studiosi propose un metodo per l'esecuzione automatica della gestione degli overlay, senza che il programmatore sapesse neppure che cosa stava succedendo. Questo metodo, ora chiamato memoria virtuale, ha l'ovvio vantaggio di liberare il programmatore da un sacco di lavoro amministrativo.

La paginazione

L'idea proposta dal gruppo di studiosi fu di separare i concetti di spazio di indirizzamento e di locazioni di memoria. Considerate l'esempio di un calcolatore con un campo di indirizzamento di 16 bit nella sua istruzione e 4096 byte di memoria. Un programma su questo calcolatore può indirizzare 65536 byte di memoria. La ragione è che esistono 65536 (216) indirizzi di 16 bit.

Prima dell’invenzione della memoria virtuale si sarebbe fatta una distinzione tra gli indirizzi al di sotto di 4096 e quelli uguali o superiori a 4096. Le due parti erano considerate rispettivamente come lo spazio di indirizzamento utile e lo spazio di indirizzamento inutile (gli indirizzi maggiori di 4095 erano inutili perché non corrispondevano a indirizzi effettivi di memoria). Non si faceva però una grossa distinzione tra lo spazio di indirizzamento e gli effettivi indirizzi di memoria, perché l'hardware applicava una corrispondenza uno a uno tra di loro.

L'idea di separare lo spazio di indirizzamento e gli indirizzi di memoria è la seguente. In qualsiasi istante si può accedere direttamente a 4096 byte di memoria, ma queste non corrispondono necessariamente agli indirizzi da 0 a 4095. Potremmo, per esempio, "dire" al calcolatore che da ora in poi, tutte le volte che si dà l'indirizzo 4096, deve essere usato il byte 0. Quando si dà l'indirizzo 4097, si deve usare il byte 1. Quando si dà l'indirizzo 8191, si deve usare il byte 4095 ecc. In altre parole abbiamo definito una funzione dallo spazio di indirizzamento sugli indirizzi di memoria effettivi.

Sulla base di questa rappresentazione della funzione dallo spazio di indirizzamento alle locazioni effettive di memoria, una macchina di 4K senza memoria virtuale ha semplicemente una corrispondenza fissa tra gli indirizzi da 0 a 4095 e 4096 byte di memoria. Una domanda interessante è: che cosa succede se un programma salta ad un indirizzo, tra 8192 e 12287? Nella macchina senza memoria virtuale il programma provoca un trap per l'errore, che stampa un messaggio abbastanza rude come "riferimento a memoria inesistente" e termina il programma.

Nella macchina con memoria virtuale si verifica la seguente sequenza di passi:

  • I contenuti della memoria centrale sono salvati in una memoria secondaria;
  • I byte da 8192 a 12287 sono localizzati nella memoria secondaria;
  • I byte da 8192 a 12287 sono caricati nella memoria centrale;
  • La mappa degli indirizzi viene cambiata per rappresentare gli indirizzi 8192 a 12287 sulle locazioni di memoria da 0 a 4095;
  • L’esecuzione continua come se non fosse successo nulla d’insolito.

Questa tecnica per l'esecuzione dell'overlay automatico è chiamata paginazione e i pezzi di programma letti dalla memoria secondaria sono detti pagine. È possibile anche un modo più sofisticato per far corrispondere lo spazio d’indirizzo con gli indirizzi effettivi di memoria. Per chiarezza, chiameremo gli indirizzi a cui il programma può fare riferimento spazio di indirizzamento virtuale e gli indirizzi di memoria effettivamente cablati spazio di indirizzamento fisico. Una mappa di memoria mette in relazione gli indirizzi virtuali con gli indirizzi fisici. Presumiamo che ci sia abbastanza spazio nella memoria secondaria per memorizzare l’intero programma e i suoi dati.

I programmi sono scritti come se ci fosse abbastanza memoria centrale per l’intero spazio di indirizzamento virtuale, anche se ciò non si verifica. I programmi possono caricare o memorizzare una qualsiasi parola nello spazio di indirizzamento virtuale, o saltare ad una istruzione localizzata in un posto qualsiasi entro lo spazio di indirizzamento virtuale, senza preoccuparsi che in realtà non ci sia abbastanza memoria fisica. Infatti, il programmatore può scrivere programmi senza sapere se la memoria virtuale esiste. Il calcolatore sembra avere una grossa memoria.

Per sottolinearlo ancora una volta, la paginazione dà al programmatore l'illusione di una grande memoria centrale continua e lineare, della stessa dimensione dello spazio di indirizzamento, anche se in pratica la memoria centrale disponibile può essere più piccola dello spazio di indirizzamento.

Struttura a moduli

Useremo il termine di modulo di elaborazione, per denotare delle entità attive, capaci cioè di autocontrollo nel gestire sia la propria evoluzione interna che le interazioni con gli altri moduli. Un concetto usato è quello di tipo di dato astratto, cioè di entità che implementano precise strutture dati rese visibili dall’esterno solo mediante le operazioni su di esse definite. Una computazione può essere vista come un insieme di istanze di tipi di dati astratti cooperanti: la cooperazione avviene mediante l’invocazione reciproca di operazioni ed è resa possibile dall’esistenza di precise interfacce a cui in generale saranno associati diritti di accesso o di protezione.

Un modulo può decidere di non ascoltare invocazioni da altri; una volta in possesso delle informazioni necessarie è in grado di eseguire nel proprio ambiente di elaborazioni una o più operazioni; le modalità di cooperazione con gli altri moduli devono essere congruenti con la definizione delle interfacce fra moduli.

Il microprocessore

In tutti i PC è il microprocessore che esegue ogni tipo di programma. Il microprocessore, o unità di elaborazione centrale (CPU), svolge calcoli, confronti e trasferimenti di dati in risposta ai programmi memorizzati. La CPU è composta da diverse parti: l’unità di controllo che ha il compito di prelevare le istruzioni dalla memoria principale e di determinarne il tipo; l’unità aritmetico-logica esegue le operazioni elementari. La CPU contiene anche una piccola memoria ad alta velocità usata per memorizzare i risultati temporanei e certe informazioni di controllo. Questa memoria è costituita da alcuni registri, ognuno dei quali ha una sua funzione. Il registro più importante è l’accumulatore di programma, che indica la prossima istruzione da eseguire. Un altro registro è il registro delle istruzioni (IR) che contiene le istruzioni che stanno per essere eseguite. La CPU controlla le operazioni fondamentali del computer, inviando e ricevendo segnali di controllo, indirizzi di memoria e dati da una parte del computer all’altra, lungo un gruppo di linee di collegamento elettronico (BUS).

Il bus è semplicemente un gruppo di linee comuni sulla scheda madre, a cui sono collegate tutte le diverse sezioni di controllo del computer. Vi sono due tipi di bus: dati e indirizzi. Il bus indirizzi utilizza 20 linee di segnale per identificare le celle di memoria e le periferiche collegate ad esso. Ciascuna linea può assumere due valori 0 e 1 (bit), quindi questo bus può identificare fino a 220 indirizzi. Il bus dati opera in stretto collegamento con il bus indirizzi per trasferire i dati all’interno del computer. Solitamente il bus dati è di otto linee, quindi si hanno 8 bit.

Uno dei compiti essenziali della CPU è di rispondere agli interrupt hardware. Questi sono segnali generati dai componenti del PC, che in questa maniera richiedono un particolare servizio da parte della CPU. Il microprocessore dispone di un circuito controllore programmabile degli interrupt (PIC) che segue gli interrupt e li segnala uno alla volta alla CPU. Questa risponde eseguendo una speciale routine software detta di gestione dell’interrupt. Alcune parti del computer sono in grado di trasferire dati da e verso la memoria del computer senza passare per la CPU. Questa operazione è detta accesso diretto alla memoria (DMA), e viene gestita da un chip detto appunto gestore del DMA. Il suo scopo principale è consentire la lettura/scrittura sui dischi senza far lavorare ulteriormente la CPU.

La memoria

La memoria è quella parte del calcolatore in cui sono immagazzinati i programmi e i dati. L’unità fondamentale della memoria è la cifra binaria, chiamata bit, che può assumere i valori 0 e 1. La memoria è costituita da un numero di locazioni, ognuna delle quali può immagazzinare 8 bit (byte). Ogni locazione è identificata da un indirizzo, al quale i programmi si riferiscono. Se una memoria ha n celle, essa avrà gli indirizzi da 0 a n-1. Tutte le celle contengono lo stesso numero di bit. L’8086 è un microprocessore a sedici bit in teoria quindi non potrebbe indirizzare più di 64kB di memoria, in effetti arriva fino a 1024kB. Ciò è possibile perché l’8086 usa un bus indirizzi di 20 bit. Mentre la memoria dei PC è suddivisa in un gran numero di singoli byte, molte operazioni vengono eseguite su parole di 16 bit, che vengono poste in memoria all’interno di 2 qualsiasi byte adiacenti. Il byte meno significativo della parola viene allocato nella locazione di memoria ad indirizzo più basso, e quello più significativo nella successiva locazione. Per la particolare collocazione dei byte in questo schema, tale tipo di memorizzazione viene anche chiamato “a rovescio”.

E69C Indirizzi crescenti valore della parola: (E6C9) H

L’8086 suddivide lo spazio in memoria in segmenti, ciascuno dei quali è lungo 64kB. Ogni segmento incomincia ad un indirizzo di paragrafo. Per accedere ai singoli byte o parole si usa un offset che punta ad una particolare locazione d’un byte entro quel segmento. Dato che gli offset vengono misurati a partire dal segmento, essi vengono anche chiamati indirizzi relativi o offset relativi. Un segmento e un offset insieme costituiscono un indirizzo segmentato che può servire ad indicare una qualsiasi locazione entro lo spazio di 1024kB indirizzabile dall’8086. Questo converte un dato indirizzo segmentato fornito su 32 bit in un indirizzo fisico a 20 bit impiegando il valore del segmento come numero di paragrafo e sommandovi il valore dell’offset. In pratica, l’8086 sposta di 4 bit verso sinistra il valore del segmento, e vi somma l’offset per dare un indirizzo a 20 bit (indirizzo fisico).

Es. 1234:4321 12340+4321=16661

I registri

L’8086 è stato concepito per eseguire istruzioni e svolgere operazioni aritmetiche e logiche, oltre che per ricevere istruzioni e trasferire dati da e verso la memoria. Per fare questo impiega un certo numero di registri a 16 bit. Di questi registri ne esistono 14 in tutto, ognuno con un proprio impiego. Quattro registri di transito sono usati dai programmi per contenere temporaneamente i risultati parziali e gli operandi delle operazioni aritmetiche e logiche. Quattro registri segmento contengono i valori dei segmenti. Cinque registri puntatore e indice contengono gli offset da usare assieme ai valori dei registri segmenti per localizzare dati in memoria. In fine un registro dei flag contiene 9 flag di un bit ciascuno utilizzati per memorizzare informazioni di stato.

I registri di transito

Quando un computer elabora dei dati, gran parte del tempo il microprocessore lo adopera per trasferire i dati da e verso la memoria. Il tempo di elaborazione però può essere ridotto con l’utilizzo dei registri di transito, che presentano tempi di accesso notevolmente inferiori rispetto a quelli delle memorie. Questi sono i registri: AX, BX, CX, DX. Ciascuno di essi può essere utilizzato come due registri a 8 bit. Tali registri corrispondenti di ordine alto sono detti: AH, BH, CH, DH; quelli di ordine basso sono: AL, BL, CL, DL. Anche se questi registri sono disponibili per ogni tipo di lavoro temporaneo, ognuno è specificatamente idoneo per un impiego particolare:

  • Il registro AX (accumulatore) è il registro principale per eseguire le operazioni aritmetiche
  • Il registro BX (base) può essere impiegato per puntare all’inizio di una tabella di conversione entro la memoria
  • Il registro CX (contatore) viene usato come contatore per il controllo dei cicli iterativi e per ripetuti spostamenti dei dati.
  • Il registro DX (dati) viene usato per scopi generali

I registri segmento

L’indirizzo completo di una locazione di memoria è costituito da un valore a 16 bit di segmento e di un offset a 16 bit entro tale segmento. Quattro registri, denominati CS, DS, ES e SS, vengono impiegati per identificare 4 specifici segmenti di memoria. Ciascun registro segmentato viene usato per un particolare indirizzamento:

  • Il registro CS definisce il segmento del codice, che contiene il programma da eseguire
  • I registri DS e ES definiscono i segmenti dei dati in cui vengono memorizzati i dati utilizzati dal programma
  • Il registro SS definisce il segmento dello stack

In un programma, questi 4 registri si riferiscono ad aree di memoria adiacenti.

CS: Programma eseguibile
DS: Dati del programma
SS: Stack

CS:IP I registri degli offset

Anteprima
Vedrai una selezione di 6 pagine su 21
Architettura degli elaboratori - Appunti Pag. 1 Architettura degli elaboratori - Appunti Pag. 2
Anteprima di 6 pagg. su 21.
Scarica il documento per vederlo tutto.
Architettura degli elaboratori - Appunti Pag. 6
Anteprima di 6 pagg. su 21.
Scarica il documento per vederlo tutto.
Architettura degli elaboratori - Appunti Pag. 11
Anteprima di 6 pagg. su 21.
Scarica il documento per vederlo tutto.
Architettura degli elaboratori - Appunti Pag. 16
Anteprima di 6 pagg. su 21.
Scarica il documento per vederlo tutto.
Architettura degli elaboratori - Appunti Pag. 21
1 su 21
D/illustrazione/soddisfatti o rimborsati
Acquista con carta o PayPal
Scarica i documenti tutte le volte che vuoi
Dettagli
SSD
Ingegneria industriale e dell'informazione ING-INF/05 Sistemi di elaborazione delle informazioni

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher flaviael di informazioni apprese con la frequenza delle lezioni di Architettura degli elaboratori e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli Studi di Messina o del prof Fiumara Giacomo.
Appunti correlati Invia appunti e guadagna

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community