2009-10-18 12 views
13

Ich verstehe, was es bedeutet, Speicher zuzugreifen, so dass es ausgerichtet ist, aber ich verstehe nicht, warum dies erforderlich ist. Zum Beispiel, warum kann ich auf ein einzelnes Byte von einer Adresse 0x…1 zugreifen, aber ich kann nicht auf ein halbes Wort (zwei Bytes) von der gleichen Adresse zugreifen.Verständnis der Wortausrichtung

Wieder verstehe ich, dass wenn Sie eine Adresse A und ein Objekt der Größe s haben, dass der Zugriff ausgerichtet ist, wenn A mod s = 0. Aber ich verstehe einfach nicht, warum das auf Hardwareebene wichtig ist.

Antwort

26

Hardware ist komplex; Dies ist eine vereinfachte Erklärung.

Ein typischer moderner Computer kann einen 32-Bit-Datenbus haben. Dies bedeutet, dass jeder Abruf, den die CPU durchführen muss, alle 32 Bits einer bestimmten Speicheradresse abruft. Da der Datenbus nichts kleiner als 32 Bit holen kann, werden die niedrigsten zwei Adressbits nicht einmal auf dem Adressbus verwendet, so dass es so ist, als wäre der RAM in eine Sequenz von 32 Bit Worten statt 8-Bit organisiert. Bit Bytes.

Wenn die CPU einen Abruf für ein einzelnes Byte durchführt, liest der Lesezyklus auf dem Bus 32 Bits, und dann wird die CPU 24 dieser Bits verwerfen und die verbleibenden 8 Bits in ein beliebiges Register laden. Wenn die CPU über einen 32 Bit-Wert holen will, die nicht auf einem 32-Bit-Grenze ausgerichtet ist, hat es mehrere allgemeine Möglichkeiten:

  • auszuführen zwei separate Lesezyklen auf dem Bus, um die entsprechenden Teile des zu laden, Datenwort und sie wieder zusammensetzen
  • lesen Sie das 32-Bit-Wort an der Adresse durch das Wegwerfen der niedrigen zwei Bits der Adresse
  • lesen Sie einige unerwartete Kombination von Bytes in einem 32-Bit-Wort zusammengebaut, wahrscheinlich nicht die Sie gesucht
  • werfen Sie eine Ausnahme

Verschiedene CPUs, mit denen ich gearbeitet habe, haben alle vier dieser Pfade genommen. Im Allgemeinen ist es für eine maximale Kompatibilität am sichersten, alle n-Bit-Lesevorgänge auf eine n-Bit-Grenze auszurichten. Sie können jedoch sicher Verknüpfungen verwenden, wenn Sie sicher sind, dass Ihre Software in einer bestimmten CPU-Familie mit bekanntem nicht ausgerichteten Leseverhalten ausgeführt wird. Und selbst wenn unausgerichtete Lesevorgänge möglich sind (wie bei CPUs der x86-Familie), sind sie langsamer.

+0

http://www.ibm.com/developerworks/library/pa-dalign/ – KawaiKx

+0

* die niedrigsten zwei Adressbits werden nicht einmal auf dem Adreßbus verwendet * Wenn ja, wie wird die 32-Bit-Adresse mit nur 30 adressiert? Bit? Korrigiere mich Wenn ich falsch liege. –

7

Der Computer liest immer einige Blöcke fester Größe ein, die ausgerichtet sind.

Also, wenn Sie Ihre Daten nicht im Speicher ausrichten, müssen Sie wahrscheinlich mehr als einmal lesen.

Beispiel

  • Wortgröße 8 Byte
  • Ihre Struktur ist auch 8 Bytes
  • , wenn Sie es ausrichten, werden Sie
  • ein Brocken zu lesen, wenn Sie don‘ t es auszurichten, müssen Sie zwei Stücke lesen

So ist es im Grunde zu beschleunigen.

-1

Ich habe sehr grundlegende (vielleicht dumme) Frage hier: Warum würde dieser Speicher nicht an erster Stelle ausgerichtet? Ich meine, wenn Sie Daten für eine bestimmte Maschine lesen und schreiben, würden Sie ihre Ausrichtungsregeln befolgen. Auf 32-Bit-System werde ich sicherstellen, Daten zu schreiben, die 32-Bit ausgerichtet ist.

Hat das etwas mit der Netzwerk-Byte-Reihenfolge zu tun?

+0

Dies ist eine Theoriefrage. – ChrisDiRulli

+1

Es hat nichts mit Netzwerk-Byte-Reihenfolge zu tun. Der Grund dafür ist, dass die Daten im L1- (Data) -Cache gespeichert werden müssen und jede Cache Line eine Größe von 64 Byte haben muss (sie kann für eine andere Architektur unterschiedlich sein, aber die Regeln sind gleich) Wenn Sie also versuchen, es an der Grenze einer Cache-Zeile zu speichern, müssen zwei Zeilen gelesen und geschrieben werden, weil sie geändert wurden. Dies führt zu einem erhöhten Leistungseinbruch. Aus diesem Grund müssen Daten auf "Boundarys" ausgerichtet werden. – Quonux

0

Versuchen Sie, eine serielle Schnittstelle zu lesen. Die Daten sind 8 Bit breit. Nette Hardware-Designer stellen sicher, dass es auf einem am wenigsten signifikanten Byte des Wortes liegt.

Wenn Sie eine C-Struktur haben, die Elemente nicht Wort ausgerichtet hat (aus Rückwärtskompatibilität oder Erhaltung des Speichers sagen) dann ist die Adresse eines Bytes innerhalb der Struktur nicht Wort ausgerichtet.

2

Der Grund für alle Ausrichtungsregeln sind die verschiedenen Breiten der Cache-Zeilen (Instruction-Cache haben 16 Byte Zeilen für die Core2-Architektur, und die Data-Cache haben 64-Byte-Zeilen für L1 und 128- Byte-Zeilen für L2).

Wenn Sie also Daten speichern/laden möchten, die eine Cahce-Liniengrenze überschreiten, müssen Sie beide Cache-Linien laden und speichern, was die Leistung beeinträchtigt. Sie tun es einfach nicht wegen der Leistungseinbußen, es ist so einfach.

+1

könnten Sie Ihre Antwort mehr erarbeiten? das klingt interessant. Moderne Prozessoren adressieren den Speicher selten direkt. Was sie tatsächlich Daten holen, ist Cache. also sollte Wortausrichtung nur etwas mit dem Cache zu tun haben? Danke vielmals – KawaiKx