Physische Adresse vs. virtuelle Adresse

Die physische Adresse ist die Hardwareadresse des physischen Speichers und die virtuelle Adresse ist diejenige, die der Prozessor sehen wird, sie hat ein Tag und einen Offset. Ich verstehe das. Kann jemand es mit einem Beispiel beschreiben, wie die MMU diese Operation ausführt (was sie zur physikalischen Adresse hinzufügt) und was die Speicherzuordnung ist? Und was ist physisch adressiert physisch getaggt, virtuell adressiert virtuell getaggt?

Siehe "Seitentabelle" und "Übersetzungs-Lookaside-Puffer".
Dies ist wirklich eine Frage der Computerarchitektur, keine EE-Frage. Gibt es dafür nicht eine andere SE-Site?
@DaveTweed ... seit wann hat Computerarchitektur nichts mit EE zu tun? #beleidigt #ECE

Antworten (3)

Die Adressübersetzung wird über einen Translation Lookaside Buffer (TLB) abgewickelt, der nur ein Cache für Übersetzungsinformationen (und einige Metadaten wie Berechtigungen, Cachefähigkeit usw.) ist. Der TLB funktioniert, indem er die physische Seitennummer (die Adressbits über denen, die zum Indizieren innerhalb einer Seite verwendet werden) durch die bereitgestellte virtuelle Seitennummer ersetzt (dh die virtuelle Seite wird auf die physische Seite abgebildet). (Da virtuelle Seiten mit physischen Seiten auf Seitengranularität ausgerichtet sind, stimmen die Bits, die innerhalb einer Seite indiziert werden, mit virtuellen und physischen Adressen einer bestimmten Seite überein.)

Um die Verzögerung beim Abrufen von Daten zu verringern, wird der Cache typischerweise parallel zur TLB-Suche mit der virtuellen Adresse indiziert; dies wäre ein virtuell adressierter Cache, aber wenn nur Indexbits innerhalb einer Seite verwendet werden, dann ist es auch ein physikalisch adressierter Cache (weil diese Bits der virtuellen Adresse mit den Bits der physikalischen Adresse übereinstimmen). (Ein Cache kann zumindest teilweise parallel zum TLB-Zugriff physisch adressiert werden, indem die zusätzlichen nicht virtuellen Bits vorhergesagt oder die zusätzlichen Bits nach einer teilweisen Indizierung des Caches eingespeist werden, aber die Kompromisse scheinen virtuell adressierte Caches zu bevorzugen.)

(Die Verwendung nicht physikalischer Adressbits beim Indizieren des Caches kann zu Komplexitäten führen, da eine andere Zuordnung der Seite möglicherweise nicht dieselben virtuellen Indizierungsbits verwendet.)

Gegenwärtig wird physisches Tagging bevorzugt, bei dem ein Cache-Treffer bestimmt wird, indem das Tag am entsprechenden Index mit der angeforderten physischen Adresse verglichen wird. Die Kohärenz mit anderen Geräten, die auf den Speicher zugreifen (E/A-Geräte oder Prozessoren), die dem System physikalische Adressen bereitstellen, ist mit physikalischen Tags einfacher (wodurch die Notwendigkeit eines Übersetzungsmechanismus von physikalischer Adresse zu virtueller Adresse vermieden wird, obwohl physikalische Tags zusätzlich bereitgestellt werden könnten zu virtuellen Tags durch Duplizieren des Tagspeichers oder durch Nutzung eines inklusiven L2-Cache).

Beispielsweise gäbe es bei einem 8-KiB-Zweiwege-Set-assoziativen Cache mit 16-Byte-Blöcken, die 4-KiB-Seiten in einem 32-Bit-Adressraum verwenden, 256 Sätze (Gruppen von Cache-Blöcken, die denselben Index teilen) – was 8 Bits erfordert Index. Ein Laden des 32-Bit-Wortes bei 0x00ab_1134 würde die Sätze mit 8 Bits (0x13) indizieren, die zwei Tags für diesen Satz lesen und die Wörter bei Offset 0x4 in beiden Datenblöcken für den Satz lesen. (Das Lesen beider Blöcke reduziert die Verzögerung.) Während der Indizierung des Caches werden die Seitennummer, die obersten 20 Bits der Adresse (0x00ab_1) dem TLB präsentiert (normalerweise mit einer angehängten Adressraum-ID); vorausgesetzt, die Informationen für diese Seite sind im TLB verfügbar (ein TLB-Treffer), die Übersetzung wird gesendet, um mit beiden Tags verglichen zu werden, was entweder zu einer Übereinstimmung mit einem der Tags führt (in diesem Fall werden die diesem Tag entsprechenden Daten ausgewählt) oder zu keiner Übereinstimmung (in diesem Fall gibt es einen Cache-Fehlschlag). (Der TLB prüft auch, ob der Prozess eine Leseberechtigung für diese Seite hat.)

Mit einem virtuell markierten Cache kann der TLB aus dem kritischen Pfad herausgenommen werden (wodurch die Cache-Zugriffsverzögerung mit einem größeren TLB möglicherweise reduziert wird), da er nur für Berechtigungsprüfungen benötigt wird, nicht für den Tag-Vergleich. (Berechtigungsinformationen könnten sogar in den Cache-Tags enthalten sein.) Typischerweise hat ein System einen größeren virtuellen Adressraum als einen physischen (zwischenspeicherbaren) Adressraum, sodass virtuelle Adress-Tags mehr Speicherplatz benötigen würden; Dieser Speicherbedarf wird durch das Hinzufügen von Adressraum-IDs erhöht, um zu vermeiden, dass der Cache geleert werden muss, wenn ein anderer Prozess geladen wird (ein Betriebssystem mit einem einzelnen Adressraum würde eine solche Leerung nicht benötigen).

Der Wikipedia-Artikel für "CPU-Cache" könnte hilfreich sein.

Es ist schwer zu sagen, was Sie fragen, und dies ist nicht der richtige Ort für ein Buch über virtuellen Speicher. Anscheinend fragen Sie sich, wie die Adressübersetzung von virtuellen in physische Adressen funktioniert. Ich versuche es kurz zu erklären.

Es gibt viele Möglichkeiten, dies zu tun, mit einigen Kompromissen zwischen dem, was automatisch von der Hardware gehandhabt wird, und auf welcher Ebene die Dinge zu komplex werden, sodass die Software eingebunden werden muss. Grundsätzlich gibt es für einen Block virtueller Adressen, der seine Daten bereits im realen Speicher hat (eingelagert), einen Hardware-Übersetzungsmechanismus. Die niedrigen Adressbits werden direkt abgebildet, sodass nur die oberen Bits übersetzt werden müssen. Wenn Seiten beispielsweise 1 k groß sind, dann sind die niedrigen 10 Bits jeder virtuellen und der entsprechenden physikalischen Adresse gleich. Die oberen Bits identifizieren die Seite, aber es können noch viele davon vorhanden sein. Beispielsweise gibt es auf einer 32-Bit-Adressmaschine mit 1 k großen Seiten 22 Seitenadressenbits oder 4 M Seiten.

Sie könnten eine Tabelle mit 4 M Einträgen erstellen, aber diese muss sich in einem speziellen schnellen Speicher befinden, da sie für jede Adressreferenz verwendet wird. Das wäre sehr teuer, daher wird normalerweise eine viel kleinere Liste kürzlich verwendeter Seiten in einem speziellen Hochgeschwindigkeitsspeicher gehalten. Dieses Gedächtnis muss assoziativ sein (inhaltlich adressiert). Anders ausgedrückt, jede Seite, auf die alle Einträge in diesem Hochgeschwindigkeitsspeicher verweisen, wird parallel überprüft, um zu sehen, welcher, wenn überhaupt, die Zuordnungsinformationen für diese spezielle Seite enthält. Derjenige, der dies tut, liefert die oberen Bits der realen Adresse, die dann mit den niedrigen Bits kombiniert werden, um die Adresse zu bilden, an der sich dieses Wort derzeit im realen Speicher befindet. Dieser spezielle assoziative Hochgeschwindigkeitsspeicher wird oft als Translation Lookaside Buffer oder TLB bezeichnet.

Wenn keiner der TLB-Einträge mit der Seitenadresse übereinstimmt, wird die Sache komplizierter. Ich werde nicht auf all das eingehen, weil es viel darüber geschrieben gibt. Wenn Sie mehr wissen möchten, stellen Sie gezielte Fragen.

Die Befehlssätze der meisten Prozessoren haben entweder das Konzept eines einheitlichen Adressraums, in dem jede Position durch eine einzelne "Nummer" adressiert wird (im Gegensatz zu einem Bitmuster, was bedeutet, dass 0x1000 als "näher" an 0x0FFF angesehen wird als an 0x0000, obwohl dies der Fall ist unterscheidet sich von ersterem um 13 Bits und von letzterem nur um ein Bit) oder einer kleinen Anzahl solcher Leerzeichen (vielleicht einer für E/A und einer für Speicher usw.). Während bei manchen Systemen jede unterschiedliche Zahl permanent einem bestimmten Speicherschaltkreis zugeordnet ist, ist es in den meisten Fällen möglich, dass auf einen gegebenen Speicherplatz über eine Vielzahl von Zahlen zugegriffen werden kann. In solchen Fällen weist die Dokumentation für ein System jeder Speicherschaltung oft eine einzelne "permanente" Nummer zu, die als ihre "Hardwareadresse" bezeichnet wird. Dies ist n'

Besonders bei älteren Systemen war der häufigste Grund dafür, dass Speicher unter mehreren Adressen zugänglich waren, nicht etwa komplizierte Schaltungen, sondern deren Fehlen. Ein System verwendet 16-Bit-Zahlen zur Darstellung von Speicheradressen (Adressraum im Wert von 64 KB) und hat nichts auf dem Speicherbus, sind ein 8-KB-ROM-Chip und ein 2-KB-RAM-Chip, würde normalerweise das obere Bit der Adresse verwenden, um zwischen den ROMs auszuwählen und RAM-Chip, und verwenden Sie die unteren 13 oder 11 Bits, um eine Adresse innerhalb des Chips auszuwählen, und ignorieren Sie einfach die restlichen Adressbits. Der Zugriff auf die Speicheradresse 0x1234 ( 0001 0010 0011 0100) würde bewirken, dass das System den ROM-Chip auswählt (da das hohe Bit gelöscht ist) und die unteren 13 Bits der Adresse an den Chip sendet und auf die Stelle 0x1234 ( ) davon zugreift 1 0010 0011 0100. Speicherort lesen 0x5234 (0101 0010 0011 0100) würde das System ebenfalls veranlassen, den ROM-Chip auszuwählen und die unteren 13 Bits der Adresse an den Chip zu senden (wieder 1 0010 0011 0100). Somit würden 0x5234 und 0x1234 beide auf dieselbe Adresse abgebildet werden (die typischerweise als Hardwareadresse 0x1234 bezeichnet würde).

In dem oben beschriebenen System war die Abbildung zwischen logischen Adressen (die Zahlen, die der Prozessor sieht) und physikalischen Adressen (die Speicherschaltungen identifizieren) festgelegt. In neueren Systemen existieren verschiedene Mittel, mit denen die Abbildungen geändert werden können. Ein gängiges Muster (das immer noch in einigen Mikrocontrollern verwendet wird, jedoch nicht in Desktop-Prozessoren) besteht darin, eine Schaltung zu haben, die einen oder mehrere diskrete Bereiche des Adressraums erkennt und den Inhalt bestimmter Steuerregister in Teile des Adressbusses einspeist, wenn sie aktiviert werden. Dieser Ansatz macht es möglich, dass ein Prozessor auf einen Speicher zugreifen kann, der viel größer ist als sein normaler Adressraum. Beispielsweise könnte ein Prozessor mit einer 16-Bit-Adresse (64K-Adressraum) so mit einem Megabyte RAM verbunden werden, dass eine Adresse der Form ) 11xx xxxx xxxx xxxxauf eine Hardwareadresse abgebildet wird1111 11xx xxxx xxxx xxxx, während eine Adresse der Form 10xx xxxx xxxx xxxxauf die Hardwareadresse abgebildet wird rrrr rrxx xxxx xxxx, wobei rr rrrrder Inhalt eines speziellen 6-Bit-Registers dargestellt wird). Um das Verschieben von Daten zwischen verschiedenen Teilen des Speichers zu erleichtern, haben viele solcher Systeme zwei oder mehrere Adressbereiche, deren Hardwareadresse unabhängig konfiguriert werden kann. Zum Beispiel könnte das oben erwähnte System auch Hardware enthalten, so dass ein Zugriff 01xx xxxx xxxx xxxxauf die Hardwareadresse 100 ausgeführt wird ssss ssxx xxxx xxxx xxxx, wobei ss sssses sich um ein 6-Bit-Register handelt, das unabhängig von geschrieben werden kann rr rrrr.

Viele Desktop-Rechner gehen mit dem obigen Konzept noch einen Schritt weiter. Anstatt nur eine kleine Anzahl von Adressbereichen bereitzustellen, die für den Zugriff auf viele verschiedene Speicherbereiche verwendet werden können, ermöglichen sie, dass jeder 4-KByte-Bereich des Adressraums unabhängig jedem beliebigen 4-KByte-Speicherraum zugeordnet werden kann. Solche Fähigkeiten sind sehr mächtig, aber viel komplizierter, als es sich lohnt, hier zu diskutieren.