Virtueller Speicher in ARMv7

Published on December 13, 2018

Virtueller Speicher in ARMv7

    Hallo!

    Der Artikel bietet einen Überblick über die Architektur des virtuellen Speichersystems von ARMv7.

    Spoiler-Kopfzeile
    Die Feinheiten von Caching, DMA, LPAE und dergleichen werden nicht berücksichtigt. Eine genauere Beschreibung finden Sie in der Literatur am Ende des Artikels.

    Einleitung


    Das virtuelle Speichersystem führt mehrere Aufgaben aus. Erstens können Sie Benutzerprozesse in separaten, voneinander getrennten Speicherbereichen ablegen. Dadurch können Sie die Zuverlässigkeit des Systems erhöhen. Die Fehler eines Prozesses wirken sich nicht auf den Betrieb anderer Prozesse aus. Zweitens kann das Betriebssystem dem Prozess mehr Speicher bieten, als das System hat. Nicht verwendete Speicherseiten werden in einem Endlager verschoben und belastet dann die gewünschten, die Illusion von großen Bilden e des Speichers , als tatsächlich verfügbar ist. Drittens erleichtert der kontinuierliche virtuelle Raum das Erstellen von kundenspezifischer Software. Alle Prozesse werden in demselben Raum ausgeführt, das Betriebssystem verbirgt die tatsächliche Speicherkonfiguration im System.

    Definitionen


    Die folgenden Definitionen werden im Artikel verwendet:
    Virtuelle Adresse - Die vom Prozessorkern verwendete Adresse. Der Stapelzeiger, der Befehlszähler, das Rückgaberegister verwenden eine virtuelle Adresse.
    Physikalische Adresse - die Ausgangsadresse am Prozessorbus.
    Eine Seite ist eine Einheit zum Adressieren des virtuellen Speichers.
    Abschnitt - ähnlich wie die Seite, hat eine größere Größe.
    Ein Frame ist eine Einheit der physikalischen Speicheradressierung.
    Seitentabelle - ein Feld von Einträgen für die Adressübersetzung.
    ASID - Adressraumkennung.
    TLB - schneller Adressübersetzungspuffer.
    MMU - Speicherverwaltungseinheit.

    Tlb


    TLB ist ein sehr schneller Hardwarepuffer, der die Ergebnisse der neuesten Adressübersetzung enthält. Die Kernelanforderung für die Übersetzung der Seitenadresse und der aktuellen ASID wird an den TLB gesendet. Wenn ein gültiger Eintrag vorhanden ist, werden die Zugriffsberechtigungen für diesen Speicher überprüft, die Zugriffsmethode und die entsprechende Rahmenadresse werden an die MMU zurückgegeben. Wenn der Speicherzugriff abgelehnt wird, wird eine Hardware-Ausnahme generiert. Wenn ein TLB-Fehler aufgetreten ist (es wurde kein Datensatz gefunden), hängt das weitere Verhalten vom TTBCR-Register ab. Sie können in den Seitentabellen suchen oder eine Ausnahme generieren.

    Beachten Sie, dass bei der Bearbeitung von Seitentabellen der TLB korrekt zurückgesetzt werden muss, da irrelevante Informationen können dort verbleiben.

    Das Aktualisieren von TLB-Einträgen ist für Programmierer, die den Round-Robin-Algorithmus verwenden, transparent.
    Es ist auch möglich, einige TLB-Einträge herunterzuladen und zu korrigieren, damit sie nicht verdrängt werden.

    Bild
    Abbildung 1. TLB

    Seitentabellen


    ARMv7 ist eine 32-Bit-Architektur, daher stehen uns 4 GB adressierbarer virtueller Speicher zur Verfügung.
    Seitentabellen sind in zwei Ebenen unterteilt - L1 und L2.

    Tabelle L1 beschreibt alle 4 GB des Adressraums. Es besteht aus 4096 Datensätzen mit einer Länge von 32 Bit, von denen jeder 1 MB beschreibt. Einträge in der Tabelle werden durch die hohen 12 Bits der virtuellen Adresse ausgewählt.

    Bild
    Abb. 2 Suche nach einem Eintrag in Tabelle L1 Die

    Tabelle L1 befindet sich im physischen Speicher und ist an der 16-KB-Grenze ausgerichtet. Es gibt 4 Varianten dieser Datensätze: zur Beschreibung von Seiten, Abschnitten und Unterseiten. Nun, ein leerer Eintrag für den Speicher, der noch nicht zamaplena hat.

    Bild
    Abb. 3

    Datensatztypen in L1 Die Bits 0 und 1 geben den Datensatztyp an 00b-Fault, 01b - Deskriptor der Seiten, 10b - Deskriptor der Abschnitte (und Supersections).

    Wenn der physikalische Speicher paginiert ist, speichert die Tabelle L1 die Adresse der Tabelle L2 (physisch, ausgerichtet auf 1 Kb). Bit 9 wird vom Hersteller festgelegt (Implementierung definiert), Bits [8: 5] - für den Domänenmechanismus (in ARMv7 nicht mehr unterstützt), SBZ - Nullen.

    Wenn wir uns entscheiden, den Speicher in Abschnitte zu unterteilen, müssen Sie in L1 die entsprechende physikalische Adresse schreiben. Der Abschnitt bezieht sich direkt auf den physischen 1-MB-Speicherausrichtungsbereich. Keine Notwendigkeit für die Tabelle L2. Der Super-Abschnitt ist ein Spezialfall der Partitionierung. Der Datensatz in der L1-Tabelle sollte 16 Mal wiederholt werden. Die Ausrichtung der zugewiesenen Blöcke des physischen und virtuellen Speichers beträgt ebenfalls 16 MB.

    Die Tabelle L2 besteht aus 256 Einträgen mit jeweils 32 Bit. Es sollte auf 1 KB ausgerichtet sein.

    Bild
    Abb. 4 Suchen Sie nach einem Eintrag in der Tabelle L2

    Die Indizes in der Tabelle L2 werden aus den mittleren 8 Bits [19:12] der virtuellen Adresse gebildet. Jeder Eintrag in der Tabelle enthält die Rahmenadresse.

    Bild
    Abb. 5 Arten von Einträgen in L2-

    Seiten können in zwei Größen vorliegen: 64 KB (große Seite) und 4 KB (kleine Seite).
    Die APX- und APX-Bits setzen Lese- / Schreibberechtigungen im privilegierten / unprivilegierten Modus (Kernel / Benutzer). Die Bits TEX, C, B, S sind für den Speichertyp, das Zwischenspeichern und das Schreib-Lese-Puffern verantwortlich. Bit nG - nonGlobal erlaubt den Zugriff auf die Seite für alle Prozesse oder nur für eine bestimmte ASID.

    Die Verwendung großer Seiten reduziert die Anzahl der Einträge im TLB. Anstelle von 16 Einträgen (4Kb * 16 = 64Kb) wird dort nur einer gespeichert. Es sind jedoch 16 identische Einträge in der Tabelle L2 erforderlich.

    Durch die Möglichkeit, unterschiedliche Blockgrößen zu adressieren, kann einerseits Speicher mit der erforderlichen Granularität zugewiesen werden, andererseits kann die Anzahl der Aufrufe von Seitentabellen in einem relativ langsamen Speicher reduziert werden.

    Register


    Ein spezieller Coprozessor CP15 dient zur Steuerung des Systems (einschließlich des MMU-Blocks) in der ARM-Architektur. Durch die Verwaltung der Erinnerung und ein halbes Dutzend seiner Register. Wir sind an mehreren von ihnen interessiert - Steuerung, TTBR0 / 1, TTBCR, ContextID.

    Im Control-Register ist das Bit niedriger Ordnung für die Ein / Aus-MMU zuständig, alles ist einfach.

    Das TTBR0 / 1-Registerpaar enthält die physikalischen Adressen der Tabellen der ersten Ebene. An diesen Adressen sucht die MMU nach der gewünschten Seite.

    Mit dem TTBCR-Register können Sie den gesamten Adressraum in zwei Teile zwischen TTBR0 und TTBR1 unterteilen. Jeder von ihnen wird einen Teil der Adressen ausstrahlen. Zum Einstellen der Größe werden Bits [2: 0] verwendet. Die aufgezeichnete Zahl (von 0 bis 7 Dezimalzahlen) maskiert den höchstwertigen Teil der virtuellen Adressen. Wenn der Wert "0" ist, werden alle Adressen über TTBR0 übersetzt. Wenn „1“, werden 31-Bit-Adressen maskiert und die unteren 2 GB des virtuellen Raums durch TTBR0, die oberen durch TTBR1 durchlaufen. "2" - 31 und 30 Bits werden maskiert und die Aufteilung in 1 GB bzw. 3 GB wird erhalten. Daher kann der untere Teil der Adressen für Benutzeranwendungen verwendet werden, wobei das TTBR0-Register für den neuen Prozess überladen wird und der obere Teil für Systemanforderungen übrig bleibt.

    Bild
    Abb. 6 Geteilter Adressraum

    Bits [5: 4] sind für das Verhalten von TLB-Fehlern verantwortlich - eine Suche in den Seitentabellen oder eine Ausnahme.
    Das ContextID-Register enthält das ASID-Feld für den aktuellen Prozess. Sie muss zusammen mit dem Inhalt des TTBR0-Registers geändert werden, wenn sich der Kontext ändert.

    Adressübersetzung


    Der Algorithmus zum Konvertieren von virtuellen in physische Adressen lautet wie folgt:

    • Suchen Sie im TLB-Puffer nach der angeforderten virtuellen Adresse und der ASID
    • Wenn der TLB nicht die erforderliche Adresse hat, erfolgt eine Hardwaresuche in den Seitentabellen.

    Wenn der Kernel zuvor eine virtuelle Seite angefordert hat, wird diese im TLB gespeichert. In diesem Fall ruft die MMU den Cache aus, und es ist nichts zu tun. Wird die Seite zum ersten Mal angefordert (oder wurde sie von dort verdrängt - der TLB ist nicht sehr groß), dann erfolgt eine Suche in den Tabellen L1-L2. Die Zuordnung von virtuellen und physischen Adressen lautet daher wie folgt:
    • In dem Register TTBR0 \ TTBR1 wird die Adresse der Tabelle L1 gesucht.
    • Die oberen 10 Bits der virtuellen Adresse bilden einen Index in der Tabelle.
    • a) Wenn der Datensatz einem Abschnitt entspricht (übergeordneter Abschnitt), werden die Abschnittsattribute geprüft, und wenn alles in Ordnung ist, setzt sich die resultierende physische Adresse aus der Basisabschnittadresse (übergeordneten Abschnitt) und den unteren 20 (24) Bits der virtuellen Adresse zusammen.

      Spoiler-Kopfzeile
      Bild
      Abb. 7 Übersetzung von Adressen in Superabschnitten

      b) Wenn der Eintrag eine Tabelle L2 ist, wird die Suche darin fortgesetzt. Der mittlere Teil der virtuellen Adresse der Seite bildet den Index der Tabelle.

      Spoiler-Kopfzeile
      Bild
      Abb. 8 Übersetzung von Adressen in Tabelle L2

    • TLB-Aktualisierung wird ausgeführt

    Insgesamt besteht das virtuelle Speichersubsystem aus den folgenden Teilen:

    • Mehrere Steuerregister CP15
    • Seitentabellen mit Regeln zur Adressübersetzung
    • TLB - erfolgreicher Broadcast-Cache
    • Die MMU ist ein Block, der der Adressumsetzung gewidmet ist.

    Literatur


    Architektur - Referenzhandbuch ARM ARMv7-A und ARMv7-R Ausgabe
    ARM Cortex-A - Programmierhandbuch der Serie