|
 |
Il Processore e il Debugger |
PROCESSORE 80x86 13/14
[24 di 60] |
|
|
 |
Aggiornato
22 maggio 2007 |
 |
|
Architettura interna
[segue] |
|
 | Sulla base della
figura della pagina precedente
cerchiamo di capire come il nostro processore riesca ad
assumere ed
eseguire i
bytes del programma che è chiamato ad
interpretare. |
 | Vale la pena di ricordare che i
programmi che un processore può eseguire non sono altro che una
sequenza di bytes, freddi numeri binari
da noi espressi (per
nostra comodità) in esadecimale. |
 | Questi bytes sono di solito raccolti uno
dopo l'altro nella memoria,
puntigliosamente definita di programma
(per distinguerla da quella usata, nell'ambito dell'esecuzione, per altri
scopi, come lo
stack o le
tabelle di dati o variabili di vario
tipo); la memoria di programma può essere la classica
RAM ma anche la memoria a sola lettura
(ROM) della scheda madre (BIOS)
o della scheda video o di qualche altro dispositivo. |
 | Di sicuro c'è il fatto che il primo
byte sarà sempre un codice operativo, cioè un byte che
rappresenta un'istruzione da eseguire; ad
esso potrà seguire un altro OpCode, ma anche uno
o più bytes di dato, come succede per molte tra
le possibili istruzioni che il processore è in grado di eseguire. |
 | Poiché un byte (8 bit) può assumere
256 (28) diversi valori può sembrare che un
processore sia in grado di eseguire solo 256 diverse operazioni... troppo
poche per le ambizioni di un buon processore; è questa la ragione per la quale
le varie istruzioni sono spesso definite da più di un
codice operativo. |
 | Già con 2 OpCode si
possono potenzialmente codificare 65536 (216)
diverse istruzioni, ora decisamente troppe; la verità sta nel mezzo: non tutte
le combinazioni possibili dei bit dei codici
operativi multipli corrispondono ad altrettante istruzioni! |
 | In pratica il rapporto tra
CPU e istruzione da eseguire è
piuttosto articolato:
 | l'istruzione non è dentro il processore (.. non
ancora..): è conservata in memoria, sotto forma di uno o più bytes
consecutivi. |
 | il processore deve recuperare ciascun byte dalla memoria, ricostruendo l'indirizzo della locazione
corrispondente, con l'aiuto
del contenuto dei registri CS e
IP. |
 | solo quando l'informazione è dentro di lui può procedere
all'interpretazione del codice operativo
e dei suoi eventuali operandi, cioè all'esecuzione dell'istruzione. |
 | in ogni caso il processore per fare
questo dovrà attivare
tutte le sue risorse per
tradurre in fatti
gli ordini ricevuti. |
|
 | Per comprendere in che modo ciò sia
possibile dobbiamo imparare a conoscerlo intimamente; dobbiamo ...aprire la
scatola magica! |
 | Come detto tutto il processo comincia nell'unità di interfaccia con i bus,
Bus Interface Unit, BIU:
 | il suo primo compito consiste nella
ricostruzione (con l'aiuto del suo
sommatore interno) dell'indirizzo fisico
a partire da
quello logico, suggerito dal contenuto
dei 2 registri puntatori di codice,
CS:IP,
con il meccanismo
descritto in precedenza. |
 | non appena l'indirizzo è pronto e disponibile
sul bus address interno la
logica di controllo dei bus lo trasferisce
anche su quello esterno, attivando anche
le linee di
controllo necessarie alla lettura di
memoria. |
 | dopo i tempi tipici della Ram di sistema (qualche
nanosecondo) la memoria mette sul bus dati
il codice operativo contenuto nella locazione richiesta e il processore,
messosi istantaneamente in attesa subito dopo aver attivato le linee di
controllo, lo cattura e lo mette nei registri della
coda delle istruzioni, a disposizione della
EU. |
|
 | Questa sequenza (compito della BIU) è nota con il nome di
pre-fetch (fase precedente
al prelievo del codice operativo);
la BIU
continua (in modo autonomo e distinto dalla EU) ad eseguire il pre fetch,
ripetendo velocemente tutto da capo subito dopo
aver incrementato il registro IP,
e continuando a stoccare i bytes letti dalla memoria, uno dopo l'altro, nella
coda delle istruzioni. |
 | In questo modo EU (che analizziamo tra un attimo) trova sempre
bytes pronti ad essere eseguiti. |
 |
L'idea geniale per ottimizzare i tempi è la coda delle istruzioni:
mentre la BIU si occupa di inserirvi i bytes letti dalla memoria
la EU li estrae e li consuma traducendo in fatti il comando
binario ricevuto. Fin tanto che la coda è piena si tagliano così i
tempi morti. |
 | Il vantaggio è reale solo se
i bytes (prelevati dalla memoria e presenti nella coda) sono relativi ad
istruzioni consecutive; se la
EU
è costretta ad eseguire istruzioni di salto, la BIU
svuota completamente la coda e la
riempie da capo con i bytes della sequenza di
istruzioni che comincia al nuovo indirizzo, il chè costringe la
EU
ad attendere un po'... |
 | E' facile capire che questo processo trae enorme vantaggio
dalla presenza di una
cache interna (in pratica una specie di coda a da 8kBytes fino a
64kBytes). |
 | Dunque, mentre la BIU
prepara la materia prima (nella coda delle istruzioni)
l'unità di
esecuzione, Execution Unit, EU),
si occupa di interpretare i bytes prelevati in sequenza dalla medesima
coda,
cioè di eseguire l'istruzione. |
 | La sua
Unità di
Controllo di Esecuzione provvede ad
organizzare tutto il lavoro, che prevede 2 fasi distinte:
 | la
fase di fetch, durante la quale il byte
prelevato dalla coda viene trasferito nel suo instruction register (IR). |
 | la
fase di decode, durante la quale
il byte è
"fatto a pezzi", nel senso che ogni
codice operativo è
frazionato in gruppi di 2 3 bit, in
grado di dare indicazioni utili per la sua successiva esecuzione, come
registri coinvolti o
operazioni logiche o aritmetiche
necessarie; ogni gruppo di bit è confrontato con il contenuto di alcune
tabelle interne, in grado di attivare i giusti
segnali di controllo necessari a garantire l'effetto
suggerito dall'istruzione corrispondente al codice operativo. |
|
 | Non appena l'unità di controllo ha capito,
parte la
fase di execute, una incombenza tipica
dell'altra parte fondamentale (con i registri)
della EU: l'Unità
Aritmetico Logica (ALU); il nome
di questa struttura sottolinea la assoluta semplicità
dei compiti che un
processore è in grado di eseguire. |
 |
Nonostante l'enfasi diffusa sulla potenza dei
processori (per altro indiscutibile..) si sottolinea per l'ennesima volta
che le sue capacità operative sono effettivamente elementari:
somme, differenze, prodotti e divisioni, qualche
funzione logica (and, or, xor), qualche manipolazione
di numeri binari (rotazioni e scorrimenti di bytes); niente che ciascuno di
noi non possa fare altrettanto bene senza particolare difficoltà....
... Solo che il processore fa questo in meno di miliardesimo di
secondo! |
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|