Perché l'allineamento dei dati è usato esattamente?

6

Ogni tipo di dati deve essere allineato a un multiplo di un certo numero di byte, ad esempio un short int deve essere allineato a un multiplo di 2 byte e un int deve essere allineato a un multiplo di 4 byte.

Ma perché l'allineamento dei dati è usato esattamente, è perché la CPU può solo leggere dalla memoria in più di un certo numero, quindi per esempio quando la CPU sta leggendo un short int , può solo leggere dagli indirizzi 0, 2 , 4, 6, ecc.?

    
posta mahmoud_t1 25.08.2017 - 01:52
fonte

1 risposta

5

In sostanza, sì. È possibile che la CPU legga la memoria su indirizzi non allineati, ma richiede più tempo. Questa è probabilmente una semplificazione, ma funziona in questo modo:

Di solito ci sono un insieme di linee dati che vanno dal controller RAM alla CPU. Se si dispone di un processore a 64 bit, ad esempio, ci saranno 64 linee che vanno dal controller RAM alla CPU. Il controller RAM estrae sempre 64 bit (8 byte) di RAM e li invia lungo le linee dati verso la CPU. La CPU deve quindi mascherare ciò di cui ha bisogno e buttare via il resto.

C'è un problema, però. Il controller di memoria deve essere detto dalla CPU da quale indirizzo leggere. Quindi ci sono linee di indirizzo che vanno dalla CPU al controller di memoria. Per semplificare il controller di memoria, legge sempre da un limite allineato a 8 byte. Il circuito dovrebbe essere molto più complicato da leggere a partire da qualsiasi indirizzo, come ho capito (anche se non sono un ingegnere hardware).

Quindi, se vuoi leggere la memoria con un indirizzo allineato a 8 byte, la CPU invia l'indirizzo del byte più basso di cui ha bisogno, il controller di memoria maschera i 3 bit bassi, legge 8 byte e li rimanda indietro alla CPU. Se hai attraversato un limite di 8 byte, anche il controller di memoria deve leggere il successivo intervallo di 8 byte e inviarlo indietro. La CPU deve quindi mascherare il numero corretto di byte di ciascuna lettura, spostarli e riunirli in un numero di 8 byte. (O forse tutto ciò accade nel controller di memoria? In entrambi i casi ci vuole più tempo.)

Anche se non stai leggendo 8 byte, se leggi da un indirizzo dispari, deve ancora mascherare e spostare il risultato per inserirlo in un registro.

Alcune vecchie CPU di fascia bassa hanno fatto questo anche per alcune letture allineate. Ad esempio, credo che l'8088 avesse solo 8 linee di dati, quindi una lettura di 16 bit ha sempre portato a 2 letture e al doppio di cicli per il recupero della memoria. Una volta che i dati si trovavano nella CPU, si sono elaborati altrettanto velocemente dell'8086.

Come menzionato nei commenti, ci sono persino alcune CPU che non possono fare letture non allineate presumibilmente per semplificarne la progettazione e ridurre i costi.

    
risposta data 25.08.2017 - 04:36
fonte

Leggi altre domande sui tag