5 Stimmen

Wie werden die Daten aus dem RAM geholt?

In C ist jedes Byte einzeln adressierbar. Angenommen, eine ganze Zahl (die z.B. 4 Byte benötigt) hat eine Adresse 0xaddr (was 32 Bits sind, wenn man davon ausgeht, dass wir einen 32-Bit-Prozessor mit einem 32-Bit-Adressbus und einem 32-Bit-Datenbus haben) und nehmen wir an, dass der Wert der ganzen Zahl 0x12345678 . Wenn ich nun diesen Wert aus dem Speicher abrufe, wie macht der Prozessor das? Setzt der Prozessor 0xaddr (das ist eine 32-Bit-Adresse) auf den Adressleitungen und holen dann 8-Bit-Daten ab, z. B. 0x12 . Und dann wird der Prozessor schreiten 0xaddr+1 auf den Adressleitungen und holen dann weitere 8-Bit-Daten ab 0x34 und so weiter für die 4 Bytes einer ganzen Zahl? Oder platziert der Prozessor einfach 0xaddr und die 4 Bytes auf einmal lesen und so den vollen 32-Bit-Datenbus ausnutzen?

6voto

andrew cooke Punkte 43891

Dies ist ein bekannter Artikel von der GNU C Library Lead, die den Speicherzugriff (insbesondere in x86 - aktuellen PC - Systemen) beschreibt. Er geht viel mehr ins Detail, als Sie jemals brauchen können.

Der gesamte Artikel ist auf mehrere Teile verteilt:

  1. Einführung
  2. CPU-Caches
  3. Virtueller Speicher
  4. NUMA-Unterstützung
  5. Programmierer
  6. Mehr Programmierer
  7. Leistungstools
  8. Zukunft
  9. Anhänge

eine sache, die ich zu gbulmers antwort hinzufügen würde, ist, dass in vielen systemen ein datenstrom schneller ist, als man es von einem einzelnen wort erwarten würde. mit anderen worten: die auswahl, von wo aus man lesen möchte, nimmt etwas zeit in anspruch, aber wenn man das ausgewählt hat, ist das lesen von diesem punkt aus und dann die nächsten 32 oder 64 oder was auch immer bits und dann das nächste... schneller, als wenn man zu einer unverbundenen stelle wechselt und einen anderen wert liest.

und was die moderne Programmierung beherrscht, ist nicht das Verhalten des Abrufs aus dem Speicher auf der Hauptplatine, sondern die Frage, ob sich die Daten in einem Cache des Prozessors befinden.

4voto

gbulmer Punkte 4160

Wenn Sie im Internet nach "Computerarchitektur" suchen, werden Sie wahrscheinlich einige Antworten auf Ihre Fragen erhalten.

Für Ihre spezielle Frage: ein 32-Bit-Computer mit einem 32-Bit-Daten- und Adressbus, für einen einfachen Fall, ohne verschleiernde Hardware. Er wird 32 Bit aus einem 32 Bit breiten Speicher lesen.

Diese Art von Hardware gibt es seit den späten 1970er Jahren in Form von Minicomputern (z. B. DEC VAX), und es gibt sie immer noch in Form von Mikroprozessoren (x86, ARM, Cortex-A8, MIPS32) und in einigen Mikrocontrollern (z. B. ARM, Cortex-M3, PIC32, usw.).

Der einfachste Fall: Der Adreßbus besteht aus einer Reihe von Signalen (Drähten), die Adreßsignale an den Speicher übertragen, sowie einigen weiteren Signalen, die mitteilen, ob der Speicher "gelesen" oder "beschrieben" werden soll (Datenrichtung), und ob die Signale auf den Adreß- und Datenrichtungsdrähten gültig sind. Im Fall Ihres Beispiels könnten es 32 Leitungen sein, die das Bitmuster der Adresse übertragen.

Der Datenbus ist ein zweiter Satz von Drähten, die den Wert zum und vom Speicher übertragen. Der Speicher könnte ein Signal ausgeben, das besagt, dass die Daten gültig sind, aber er könnte auch einfach so schnell sein, dass alles "einfach funktioniert".

Wenn der Prozessor die Adresse auf die Adresssignale legt und sagt, dass er aus dem Speicher lesen will (Datenrichtung ist "Lesen"), ruft der Speicher den an dieser Adresse gespeicherten Wert ab und legt ihn auf die Datenbussignale. Der Prozessor tastet (nach geeigneten Verzögerungen und Signalen) die Datenbusleitungen ab, und das ist der Wert, den er verwendet.

Der Prozessor kann die gesamten 32 Bits lesen und intern ein Byte extrahieren (wenn das alles ist, was der Befehl erfordert), oder der externe Adressbus kann zusätzliche Signale bereitstellen, so dass das externe Speichersystem so aufgebaut werden kann, dass es die entsprechenden Byte-, Doppelbyte- oder Vierfachbyte-Werte liefert. Viele Jahre lang konnten die Versionen der ARM-Prozessorarchitektur nur die gesamten 32 Bit lesen, und kleinere Teile, z. B. ein Byte, wurden intern extrahiert.

Ein Beispiel für diese Art von Signalsatz finden Sie unter http://www.cpu-world.com/info/Pinouts/68000.html Dieser Chip hat nur einen 24-Bit-Adressbus und einen 16-Bit-Datenbus. Er hat zwei Signale (UDS und LDS), die anzeigen, ob die oberen Datensignale, die unteren Datensignale oder beide verwendet werden.

Ich habe eine recht detaillierte Erklärung unter research.cs.tamu.edu/prism/lectures/mbsd/mbsd_l15.pdf gefunden. Das habe ich gefunden, indem ich nach "68000 memory bus cycle" gesucht habe.

Es ist sinnvoll, nach MIPS, ARM oder x86 zu suchen, um deren Buszyklus zu sehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X