Perché il codice macchina viene interpretato dal microcodice piuttosto che essere compilato in microcodice?
A un certo livello, bisogna infine sottoporre una serie di porte logiche, registri, contatori e così via. Il microcodice è in grado di controllarli direttamente in base al codice macchina che sta interpretando. Il codice macchina stesso potrebbe essere fatto per operare direttamente queste porte e cose, e in effetti lo fa in molti progetti. Ma anche i progettisti di hardware sono persone, quindi gli errori sono possibili - ci possono essere dei bug nell'hardware.
La microcodifica permette loro di correggere facilmente i bug dell'hardware, o di implementare nuove istruzioni, per un cambiamento relativamente piccolo al die del processore - è solo un altro livello di indirezione che fornisce una certa assicurazione e flessibilità. Permette anche di implementare un dato set di istruzioni su diversi hardware, dato che il microcodice si occupa di gestire le differenze.
Il microcodice è davvero di basso livello - accende direttamente alcune porte e ne spegne altre per instradare i segnali nel chip. È altamente dipendente dall'hardware. Se compilaste direttamente il microcodice, dovreste avere un compilatore che tenesse conto non solo dell'esatto numero del modello del chip, ma dell'esatta revisione di quel modello, e così via. La microcodifica permette che tutte queste differenze siano prese in carico dal chip stesso, in modo che possa eseguire il codice comune. Potete scommettere che gli ingegneri lo hanno anche ottimizzato al massimo, e non è neanche come il codice di uso generale - per esempio, se avete un'istruzione che impiega 2 cicli di clock per essere eseguita, è probabile che ciò significhi che ha richiesto 2 istruzioni di microcodifica. È molto improbabile che si possa davvero risparmiare del tempo compilando direttamente il microcodice - si finirebbe ancora con un'operazione che richiede esattamente gli stessi 2 cicli, perché questa è una limitazione dell'hardware - è probabilmente il massimo che si possa ottenere.
Un ulteriore punto: il microcodice non è proprio quello che si pensa che sia. Non posso parlare per tutti i progetti, ma in uno su cui ho lavorato, il 'microcodice' era solo una grande tabella. Ogni colonna della tabella era 1 bit che controllava un gate da qualche parte che permetteva ai dati in una particolare posizione su un bus interno. Ogni riga della tabella era un passo in una sequenza. L'istruzione della macchina veniva smontata e usata per richiamare la riga iniziale della tabella per quell'istruzione. Ogni ciclo di clock passava attraverso le righe della tabella fino a raggiungere una riga finale che aveva un bit che agiva come un 'goto' che riportava il processore all'inizio del prossimo fetch. Il codice era solo una grande bitmap sequenziale. Non un vero e proprio codice, nemmeno nel modo in cui lo è il codice macchina.
Articoli simili
- Quali sono le differenze tra codice macchina, codice byte, codice oggetto e codice sorgente?
- Qual è la differenza tra bytecode, codice nativo, codice macchina e codice assembly?
- Il mio Samsung Galaxy S4 ha un codice paese XSB. Posso aggiornare manualmente il sistema operativo con un diverso codice paese, codice prodotto e CSC?
- Quale attore ha interpretato più volte un presidente degli Stati Uniti?