Estratto del documento

Architettura computer: livelli di astrazione

Un calcolatore è una struttura particolarmente complessa, in cui coesistono hardware e software. Dal basso: abbiamo il layout ovvero la disposizione dei dispositivi sul silicio, il modo in cui questi dispositivi sono realizzati (giunzioni, transistor, MOS, …). Tutto questo deve essere composto per realizzare circuiti che devono essere progettati quindi collegare opportunamente i dispositivi.

Dopo di ciò, tutto questo deve essere interconnesso per realizzare gli operatori dell’algebra booleana (and, or, not). Poi tutto ciò deve essere composto affinché siano ottenute le funzioni della ALU che saranno anche prodotto, moltiplicazione, divisione oltre alla somma e sottrazione.

I dati potranno muoversi liberamente nella CPU e, il cammino dei dati e controllo, tale blocco vuol dire quello che deve fare la ALU affinché un’operazione venga svolta correttamente facendo transitare i dati nei cammini giusti e attivando il dispositivo corretto all’istante corretto.

Tutto questo passa attraverso l’elaborazione, l’interpretazione delle singole istruzioni, o meglio, del set di istruzioni che devono essere eseguite, con la possibilità di interagire con i dispositivi esterni alla CPU, in particolare la memoria. Possono essere anche esterni al sistema rigoroso, quindi la possibilità di accedere a informazioni che vengono da sensori e possono arrivare da un modello reale da un completo asincronismo rispetto alla CPU che è un dispositivo sincrono su cui un orologio detta i tempi di coordinamento.

Livelli di istruzione e firmware

Verso l’alto troveremo il set di istruzioni che possono essere eseguite e il firmware, i programmi che in qualche modo vengono eseguiti all’avvio del calcolatore, per verificare se le parti sono funzionanti per svolgere le funzioni di base. I compilatori che sono i traduttori per i linguaggi di alto livello, il sistema operativo, tutto quell’insieme di programmi che ci rende facilmente usufruibile le risorse di elaborazione e infine i programmi applicativi come PowerPoint. Si va da aspetti fisici ad aspetti di tipo matematico.

Non si può pensare che un unico progettista affronti il problema nella sua interezza; bisogna lavorare in staff. Il modo con cui i sistemi di elaborazione sono trattati prevede la divisione in livelli gerarchici. La pratica consiste nel rappresentare il sistema in una maniera ridotta ai soli dettagli, considerati essenziali all’interesse specifico.

Livelli di astrazione

L’informatica presenta i livelli di astrazione: i livelli più alti tendono a costruire qualcosa di concreto, quelli più bassi tendono a dare una rappresentazione più granulare. Ogni livello è incorporato, ma non determinato dal livello sotto di esso. Il modo in cui i sistemi di elaborazione vengono trattati prevede la divisione in livelli gerarchici, diversi livelli di astrazione. Diversi livelli di astrazione vuol dire: vari progettisti si occupano di affrontare problematiche particolari interagendo con gli altri progettisti senza comunicare i dettagli delle singole attività che svolgono ma nascondendo tali dettagli ai progettisti dei livelli con cui interagiscono.

Chi progetta i circuiti digitali sa che tale circuito è costruito con MOS, transistor, resistenze… ma non deve sapere come sono fatti: questo è qualcosa che arriva già fatto dai livelli più bassi dell’architettura a strati. Chi progetta il compilatore deve sapere quali istruzioni devono essere eseguite ma non ha bisogno di sapere come sono interconnessi i transistor per realizzare tale istruzione.

I vari progettisti si concentrano sugli aspetti che gli competono, avendo una visione parziale di quello che accade ai livelli più bassi e più alti, senza analizzare i dettagli di questi livelli. L’architettura del set delle istruzioni è una delle astrazioni chiave nel progetto dell’interfaccia tra hardware e software di basso livello. Questo aspetto è fondamentale perché ci permette di definire come le istruzioni devono essere eseguite dal punto di vista dell’utilizzo degli operandi per quanto riguarda la restituzione del risultato, ma non ci dobbiamo preoccupare di sapere come l’hardware realizza quelle funzioni, ci sarà qualcun altro che se ne farà carico.

Evoluzione tecnologica

Quando la tecnologia evolverà, l’equazione di somma sarà comunque quella che prende due operandi e restituisce il risultato. Quello che cambierà sarà, ad esempio, la velocità, facendo uso di più o meno dispositivi e la disponibilità di un numero maggiore di dispositivi ci dà la possibilità di realizzare un circuito che comunque farà la somma ma riuscirà ad ottenere il risultato in un tempo più rapido perché magari sta usando un gran numero di dispositivi.

Architettura del set delle istruzioni

In sintesi, l’architettura del set delle istruzioni comprende tutto quello che i programmatori devono sapere per poter costruire i programmi in linguaggio macchina e questo programma deve essere perfettamente funzionante. Quindi le istruzioni, quali sono i dispositivi con cui interagire e così via, non ha bisogno di sapere la codifica binaria associata ad ogni singola istruzione perché se ne occuperanno i progettisti dei livelli inferiori.

L’architettura del set delle istruzioni rappresenta l’interfaccia standard che permette ai progettisti di parlare di funzioni indipendentemente dall’hardware che le realizza. I progettisti dei calcolatori distinguono l’architettura dall’implementazione dell’architettura stessa. Un’implementazione è una struttura fisica, un’organizzazione hardware che realizza l’astrazione prevista dall’architettura.

Tale interfaccia astratta permette a varie implementazioni con costo diverso e prestazioni diverse di eseguire lo stesso software; questo vuol dire che è possibile che le stesse istruzioni possano essere eseguite su processori diversi della stessa famiglia e quindi programmi scritti per una certa versione continuano ad essere eseguibili su versioni più evolute di quella stessa famiglia ma non accade il viceversa. Potrà accadere che ci siano estensioni dell’architettura del set delle istruzioni che non sono eseguibili su processori di generazioni precedenti.

Comunicare con un calcolatore

Per comunicare con un calcolatore si usano i bit che sono l’informazione minima che è possibile rappresentare, usarli non limita la capacità di rappresentazione globale. I comandi devono essere impartiti come sequenze di bit e queste sono le nostre istruzioni, ma anche i dati sono sequenze di bit, quindi nella memoria abbiamo valori binari da interpretare come istruzioni, valori binari che useremo come operandi.

Le sequenze di 0 e 1 sono ciò che abbiamo nella memoria. Sequenze di 0 e 1 arriveranno alla CPU e rappresenteranno le operazioni che svolgono le funzioni di nostro interesse.

Coding e traduzione

In alto ho una porzione di codice in C: gestisce 2 elementi di un vettore detti v[k] e v[k+1] e l’operazione ci permette di scambiare gli elementi del vettore. È un codice scritto in linguaggio di alto livello, ma questa scrittura non è interpretabile dalla CPU direttamente. È necessario passare attraverso un traduttore che è il compilatore, alla fine di tutto ciò che dobbiamo ottenere è una codifica binaria opportunamente interpretata che ci permette di capire quali sono le operazioni da svolgere, quali dati usare e così via. Per fare questo bisogna trasformare il linguaggio ad alto livello in un linguaggio binario.

La codifica del codice in C in assembly è:

  • lw $15, 0($2)
  • lw $16, 4($2)
  • sw $16, 0($2)
  • sw $15, 4($2)

Questa parte dell’architettura del set delle istruzioni deve essere trasformata in quelli che sono i veri bit che la CPU userà. Questi bit saranno interpretati dalla macchina la quale produrrà segnali di controllo i quali attiveranno i trasferimenti le transazioni sul bus che ci permetteranno passo dopo passo di arrivare all’operazione attesa.

Le operazioni che permettono di leggere dati dalla memoria nel processore MIPS prendono il nome di load word (lw) - caricamento di word. Quando vogliamo leggere qualcosa dalla memoria dobbiamo specificare degli elementi fondamentali: per prima cosa dobbiamo dire che vogliamo leggere dalla memoria ed è quello che abbiamo chiamato con codice operativo che è la parte di istruzione che spiega cosa si vuole fare, ma quando vogliamo leggere dalla memoria dobbiamo anche indicare quale è l’indirizzo a cui andare, la posizione che vogliamo raggiungere all’interno della memoria e infine dobbiamo anche identificare l’interlocutore che immagazzinerà l’informazione che attraverso il bus dei dati giungerà alla CPU quindi quale sarà il registro che incamererà tale informazione, tutto ciò ha bisogno di essere identificato attraverso un congruo numero di bit che costituiranno le nostre istruzioni.

Operazioni di lettura e scrittura

Pensando all’operazione di lettura dalla memoria dobbiamo avere un numero adeguato di bit che ci permette caratterizzare in maniera univoca il codice operativo, la casella di memoria da raggiungere quindi il suo indirizzo e un numero di bit che permettono di scegliere il registro che deve immagazzinare la informazione derivante dalla memoria. In maniera duale corrisponde l’operazione di scrittura nella memoria, detta store word (sw), il codice operativo ci dirà che si vorrà scrivere in memoria che vuol dire coinvolgere il bus indirizzi, bus dati e attivare la linea del bus controlli che permette di specificare che si vuole fare un’operazione di caricamento; l’indirizzo è indispensabile anche in questa situazione perché bisogna specificare quale casella di RAM vogliamo raggiungere e dobbiamo specificare quale registro ha la sorgente dell’informazione ossia nella CPU dove è contenuta l’info che non voglio perdere e che in memoria deve essere collocata.

Dato che è processore RISC non si avrà un gran numero di istruzioni diverse che si potranno scegliere quindi il numero di bit di cui si compone il codice operativo è di 6 bit e il numero di bit che ci permette di scegliere il registro di interesse non può essere molto elevato perché i registri sono nella CPU e nel suo interno ci saranno molte cose da fare e quindi non possiamo dedicare tante risorse a immagazzinare i registri. Questo è un processore che cerca il più possibile di lavorare nella CPU per poter massimizzare le performance, ha 32 registri. Se i registri sono 32, identificare un particolare registro vuol dire scegliere 1 tra 32 possibilità, quindi quanti bit servono per identificare un registro? Servirà un n tale che 2^n sia uguale a 32 ed è pari a 5, di lettura o scrittura nel caso sia load o store.

Indirizzamento e offset

Ma di quanti bit deve essere composto l’indirizzo? È un indirizzo di memoria è di nostro interesse affiancare alla CPU una memoria che sia la più estesa possibile quindi il nostro numero n di bit vincolerà la massima dimensione della memoria con cui la CPU si può interfacciare. Il bus indirizzi qui ammonta di 32 bit quindi possiamo indirizzare 2^32 posizioni differenti dove immagazzineremo delle sequenze di bit quindi il numero di bit necessari per caratterizzare ogni indirizzo è 32 quindi da tale calcolo ottengo che ho 6 bit per il op, 5 per il registro, 32 bit per l’indirizzo; ma dato che in istruzioni di questo tipo frequentemente quando si va in memoria si ha l’esigenza di raggiungere vari elementi di vettori o matrici di bi o n-dimensionali ci piacerebbe nell’istruzione poter dire non vogliamo andare esattamente alla posizione indicata dall’indirizzo ma ad es. 20 posizioni più avanti o indietro quindi poter stabilire un indirizzo di partenza del nostro vettore da modificare grazie a un campo detto OFFSET (spostamento da aggiungere alla posizione di partenza per poter raggiungere la locazione di mio interesse), ad es. voglio andare all’elemento v[10] non all’elemento v[0].

Quanti bit sono necessari per l’offset? Mi servono dei bit che permettono di muovermi nella memoria rispetto alla posizione di base del vettore, voglio un numero che sia dotato di segno che mi permette di spostarmi sia indietro che avanti, tale campo è opportuno che sia numero dotato di segno e la rappresentazione più idonea è la ca2. In questo processore ho un campo da 16 bit, che permette quindi di avere 2^16 diverse possibilità, metà per spostarsi in avanti da 0 a 2^15-1, e metà per spostarsi indietro da -1 a -2^15.

Giungo così a un numero di bit molto alto per caratterizzare l’istruzione: 6 + 5 + 16 + 32 = 59 bit, TROPPO! Non è possibile perché il processore che studiamo oltre ad avere 32 bit sul bus degli indirizzi ha 32 bit sul bus dei dati quindi in un sol colpo non posso leggere 59 bit sarebbero costretti a leggere 2 parole da 32 bit in 2 momenti diversi. Tale logica non è perseguibile, una visione semplice dove si dice ho istruzioni di varia lunghezza, quelle più semplici hanno il solo op quelle più complesse prevendono la presenza di operandi e la fase di fetch ha durata variabile in funzione complessità dell’istruzione in questo processore non è consentito.

Ho vincolo stringente in tale processore, ogni istruzione si deve comporre di 32 bit fissi quindi devo trovare il modo di farceli bastare. In un indirizzamento assoluto i 32 bit per l’indirizzo saturerebbe lo spazio a disposizione. Faccio ricorso ad un’altra modalità di indirizzamento ossia indiretto a registro ossia carico nel registro l’indirizzo a cui vogliamo andare e dentro l’istruzione ho bisogno solo di sapere quale registro fornisce base a cui sommare lo spostamento che permette di identificare la casella di memoria oggetto del trasferimento. Così la nostra istruzione potrà essere composta da: 6 + 5 + 16 + 5 = 32 bit.

lw $15, 0($2) vuol dire load word ovvero voglio leggere una parola dalla memoria, tale parola è identificata dall’indirizzo contenuto nel registro che si chiama $2, il contenuto di tale registro è il punto di riferimento del vettore che lasciamo inalterato gli sommo 0, tale indirizzo è quello che permette di raggiungere la memoria, da quella casella che raggiungeremo preleveremo il dato e questo dato sarà trasferito nel registro 15.

lw $16, 4($2), analogo a prima ma dice voglio andare 4 posizioni più avanti perché si ipotizza che ogni elemento del vettore occupa 4 caselle della memoria.

sw $16, 0($2) sw $15, 4($2) sono store word; è un’operazione duale rispetto alla precedente dove scriveremo in memoria e quello che abbiamo collocato temporaneamente in $16 è scritto nella cella di memoria raggiunta grazie al registro $2 modificato con 0, la successiva store ci permette di caricare il valore del k-esimo elemento del vettore v[k] immagazzinato temporaneamente nel registro 15 all’interno della posizione di memoria corrispondente al k+1-esimo elemento del vettore perché questo è identificato dal registro $2 spostato di 4 posizioni più avanti.

Analisi dello schema a blocchi

L’analisi dello schema a blocchi: ho un linguaggio ad alto livello, il compilatore lo traduce in basso livello quindi linguaggio assemblativo che ha una corrispondenza diretta con l’hardware del processore grazie al fatto che l’assemblatore trasforma le istruzioni di load word, store word corredate degli operandi necessari nella sequenza binaria che è l’unica cosa che la CPU sa interpretare.

La sequenza di 0-1 viene scompattata nei vari campi di cui l’istruzione si compone, ossia op, identificativi dei 2 registri, lo spostamento; ciascuna di queste parti subirà un trattamento differente in particolare il op ci permette di capire che in fase esecutiva dobbiamo fare una lettura dalla memoria piuttosto che scrittura in memoria e per fare ciò ho bisogno di identificare l’indirizzo di interesse, lo spostamento, registro coinvolto nel trasferimento dei dati. L’interpretazione dei campi delle istruzioni attiverà i segnali di controllo che istante per istante con la sincronizzazione legata al clock del sistema, permetterà di avviare ogni fase che darà luogo alla mia istruzione, in particolare la generazione dell’indirizzo, attivazione delle linee di controllo di interesse, read o write, il trasferimento sul bus dati dell’informazione, dalla CPU verso la memoria in caso di scrittura, dalla memoria verso la CPU in caso di lettura.

Linguaggi di programmazione

I linguaggi di alto livello permettono indipendenza da come funzioni la CPU, il calcolatore. Linguaggi di basso livello permettono al programmatore di avere una totale visibilità di ciò che accade nelle CPU. In linguaggi di alto livello aumenta molto la produttività dei programmatori perché i programmi sono più brevi e le istruzioni sono più intuitive e una delle certezze che si ha in ambito informatico è che tanto più i programmi diventano lunghi, tanto maggiore sarà la complessità della fase di collaudo.

Tutto ciò è pagato con una complessità nel processo di traduzione che nel caso di linguaggio assemblativo è ragionevolmente semplice perché basterà consultare una tabella di corrispondenza tra i codici simbolici e la codifica binaria, più complesso sarà il lavoro di cui si farà carico il compilatore. I primi programmatori usavano direttamente le sequenze binarie per comunicare con il calcolatore, ma ciò era noioso e incline all’errore, si passò così a istruzioni più vicine alla logica umana, comandi non binari ma che fossero.

Anteprima
Vedrai una selezione di 10 pagine su 173
Appunti dettagliati di Calcolatori elettronici Pag. 1 Appunti dettagliati di Calcolatori elettronici Pag. 2
Anteprima di 10 pagg. su 173.
Scarica il documento per vederlo tutto.
Appunti dettagliati di Calcolatori elettronici Pag. 6
Anteprima di 10 pagg. su 173.
Scarica il documento per vederlo tutto.
Appunti dettagliati di Calcolatori elettronici Pag. 11
Anteprima di 10 pagg. su 173.
Scarica il documento per vederlo tutto.
Appunti dettagliati di Calcolatori elettronici Pag. 16
Anteprima di 10 pagg. su 173.
Scarica il documento per vederlo tutto.
Appunti dettagliati di Calcolatori elettronici Pag. 21
Anteprima di 10 pagg. su 173.
Scarica il documento per vederlo tutto.
Appunti dettagliati di Calcolatori elettronici Pag. 26
Anteprima di 10 pagg. su 173.
Scarica il documento per vederlo tutto.
Appunti dettagliati di Calcolatori elettronici Pag. 31
Anteprima di 10 pagg. su 173.
Scarica il documento per vederlo tutto.
Appunti dettagliati di Calcolatori elettronici Pag. 36
Anteprima di 10 pagg. su 173.
Scarica il documento per vederlo tutto.
Appunti dettagliati di Calcolatori elettronici Pag. 41
1 su 173
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/01 Elettronica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher Enxhi_98 di informazioni apprese con la frequenza delle lezioni di Calcolatori elettronici 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 Pavia o del prof Danese Giovanni.
Appunti correlati Invia appunti e guadagna

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community