2012-03-17 4 views
5

In C ogni byte è indirizzabile individualmente. Supponiamo che un numero intero (diciamo che utilizza 4 byte) abbia un indirizzo 0xaddr (che è 32 bit, supponendo che abbiamo un processore a 32 bit con bus di indirizzo a 32 bit e bus dati a 32 bit) e supponiamo che il valore dell'intero sia 0x12345678. Ora se sto recuperando questo valore dalla memoria, come fa il processore a fare questo? Il processore inserisce 0xaddr (che è l'indirizzo a 32 bit) sulle righe dell'indirizzo e quindi recupera i dati a 8 bit, diciamo 0x12. E poi il processore andrà a passo 0xaddr+1 sulle linee di indirizzo e poi recupererà altri dati a 8 bit 0x34 e così via per i 4 byte di un intero? Oppure il processore posiziona semplicemente 0xaddr e legge i 4 byte contemporaneamente utilizzando il suo pieno bus dati a 32 bit?Come vengono recuperati i dati dalla RAM?

+0

Dipende. Di quale preciso processore stai parlando? IIRC l'8086 aveva un bus dati a 16 bit. Molti modelli più recenti (Pentium e superiori) avevano un FSB a 64 bit. – harold

+0

@harold: puoi farmi sapere come è diverso per i diversi processori. lo sto chiedendo in generale e non specifico per qualsiasi processore. come sarà fatto dire p8086 che ha un bus dati a 16 bit, e come per il bus dati a 32 bit e quello per 64? grazie – mezda

+0

è molto più complesso di un semplice bus dati, c'è anche la cache –

risposta

5

This is a well known article dal conduttore della libreria GNU C che descrive l'accesso alla memoria (in particolare in x86 - sistemi PC correnti).Va molto più in dettaglio di quanto tu possa mai aver bisogno.

L'intero articolo è distribuita su molte parti:

  1. Introduction
  2. CPU Caches
  3. Virtual Memory
  4. NUMA Support
  5. Programmers
  6. More Programmers
  7. Performance Tools
  8. Future
  9. Appendices

una cosa che vorrei aggiungere alla risposta di gbulmer è che in molti sistemi ottenendo un flusso di dati è più veloce di quello che ci si aspetta da ottenere una sola parola. in altre parole, selezionare da dove vuoi leggere richiede un po 'di tempo, ma quello che hai selezionato, la lettura da quel punto, e poi il prossimo 32 o 64 o qualsiasi bit, e poi il prossimo ... è più veloce che passare a qualche posto non connesso e leggendo un altro valore.

e ciò che domina la programmazione moderna non è il comportamento del recupero dalla memoria sulla scheda madre, ma se i dati sono in una cache della CPU.

4

Se si cerca nel web "Architettura del computer" è probabile che si ottengano risposte alle proprie domande.

Per la tua domanda specifica, un computer a 32 bit, con un bus dati e indirizzi a 32 bit, per un caso semplice, senza hardware offuscante. Legge 32 bit da una memoria a 32 bit.

Questo è il tipo di hardware esistente dalla fine degli anni '70 come minicomputer (es. DEC VAX), e esiste ancora come microprocessori (x86, ARM, Cortex-A8, MIPS32) e all'interno di alcuni microcontrollori (es. ARM, Cortex- M3, PIC32, ecc.).

Il caso più semplice: Il bus di indirizzo è un insieme di segnali (fili) che trasportano i segnali di indirizzo in memoria, oltre a pochi altri segnali per comunicare se la memoria deve essere "letta da" o "scritta su" (dati direzione) e se i segnali sull'indirizzo e i fili di direzione dati sono validi. Nel caso del tuo esempio, potrebbero esserci 32 fili per trasportare lo schema di bit dell'indirizzo.

Il bus dati è un secondo set di cavi che comunicano il valore da e verso la memoria. La memoria potrebbe affermare un segnale per dire che i dati sono validi, ma potrebbe essere abbastanza veloce che tutto 'funziona'.

Quando il processore inserisce l'indirizzo sui segnali di indirizzo, dice che vuole leggere dalla memoria (la direzione dei dati è 'letta'), la memoria recupererà il valore memorizzato a quell'indirizzo e lo metterà sui segnali del bus di dati. Il processore (dopo opportuni ritardi e segnali) campionerà i cavi del bus dati, e questo è il valore che utilizza.

Il processore può leggere l'intero 32 bit ed estrarre internamente un byte (se tutte le istruzioni lo richiedono) oppure il bus di indirizzo esterno può fornire segnali aggiuntivi in ​​modo che il sistema di memoria esterno possa essere costruito per fornire il byte appropriato , doppio byte o quad byte. Per molti anni, le versioni dell'architettura del processore ARM potevano solo leggere l'intero 32 bit, e pezzi più piccoli, e, g, un byte, sono stati estratti internamente.

È possibile visualizzare un esempio di questo tipo di set di segnali su http://www.cpu-world.com/info/Pinouts/68000.html Questo chip ha solo un bus indirizzo a 24 bit e un bus dati a 16 bit. Dispone di due segnali (UDS e LDS) che segnalano se vengono utilizzati i segnali dati superiori, i segnali dati inferiori o entrambi.

Ho trovato una spiegazione ragionevolmente dettagliata in research.cs.tamu.edu/prism/lectures/mbsd/mbsd_l15.pdf Ho trovato che cercando "68000 bus di memoria".

Si potrebbe utilmente cercare MIPS, ARM o x86 per vedere il loro ciclo di bus.