2012-06-28 5 views
5

Der Benutzer virtuellen Adressraum für x86-64 mit Linux ist 47 Bit lang. Das bedeutet im Wesentlichen, dass Linux einen Prozess mit einem virtuellen Adressbereich von ~ 128 TB abbilden kann.Wie unterstützt Linux mehr als 512 GB virtuellen Adressbereich in x86-64?

Was mich jedoch verwirrt, dass x86-64 Architektur unterstützt ISA definierte 4-Level-hierarchische Seitentabelle (als Radix-Baum angeordnet) für jeden Prozess. Das Stammverzeichnis der Seitentabelle kann nur bis zu 512 GB zusammenhängender virtueller Adressraum zuordnen. Wie kann Linux mehr als 512 GB virtuellen Adressbereich unterstützen? Werden für jeden Prozess mehrere Seitentabellen verwendet? Wenn ja, dann sollte für einen Prozess was CR3 (x86-64-Register, um die Adresse der Basis der Seitentabelle enthalten) für einen bestimmten Prozess enthalten? Fehle ich etwas?

Antwort

7

Der Stamm der Seitentabelle kann nur bis zu 512 GB zusammenhängender virtueller Adressraum zuordnen. Wie kann Linux mehr als 512 GB virtuellen Adressbereich unterstützen? Werden für jeden Prozess mehrere Seitentabellen verwendet? Wenn ja, dann sollte für einen Prozess was CR3 (x86-64-Register, um die Adresse der Basis der Seitentabelle enthalten) für einen bestimmten Prozess enthalten? Fehle ich etwas?

Ich weiß nicht, was Sie mit „Wurzel der Seitentabelle“ bedeuten, aber Paging auf x86-64 sieht wie folgt aus:

  • Seite Tabellen - das niedrigste Niveau der Paging-Strukturen. Jeder hat 512 8-Byte-Einträge (PTE) beschreibt eine 4 KiB-Seite, so beschreibt PT 512 * 4 KiB = 2 MiB des Speichers (es kann auch als 2 MiB-Seite arbeiten, aber lass es für jetzt lassen).
  • Seitenverzeichnisse - Tabelle, ähnlich PT, mit 512 8-Byte-Einträgen (PDE), die auf PTs zeigen; So beschreibt PD 512 * 2 MiB = 1 GiB des Speichers (es kann auch als 1 GiB-Seite ähnlich wie PT arbeiten).
  • Page Directory Page Table - ähnlich wie PD, enthält aber 512 8-Byte-Einträge (PDPTE), die auf PDs zeigen; so beschreibt PDPTE 512 * 1 Gib = 512 GiB des Speichers.
  • PML4, die höchste Ebene der Paging-Strukturen, ist eine Tabelle mit 512 8-Byte-Einträgen (PML4E), die auf PDPTs verweisen; So beschreibt PML4 512 * 512 GiB = 256 TiB des Speichers.

Ich weiß nicht genau Speicherkarte von Linux, aber wahrscheinlich desto höher der Hälfte (von -128 TiB auf 0 - von 0xFFFF800000000000 zu 0xFFFFFFFFFFFFFFFF) ist für den Kernel, untere Hälfte reserviert (0-128 TiB - von 0x0000000000000000 bis 0x00007FFFFFFFFFFF) ist für Userspace-Anwendungen. So unterstützt Linux 512 Mal den 512 GiB des virtuellen Adressbereichs, den Sie fragen; Selbst Torvalds würde nicht sagen: "Wir werden PML4 nicht unterstützen". Ich weiß nicht, was dich verwirrt - ist es die Tatsache, dass du den Teil vermisst hast, der besagt, dass die Seitentabelle 2 MiB abbildet und du es als eine Seite abbildet - 4 KiB - aber wenn es etwas gibt, was ich klären könnte, frag nach es.

+0

Danke für die Klarstellung.Ich habe eine Ebene falsch gezählt und damit die Verwirrung. Es ist jetzt klar. – Arka

0

In der Regel werden Prozessadressräume nicht gemeinsam genutzt, dh die beteiligten Seitentabellen werden auch nicht zwischen verschiedenen Prozessen aufgeteilt. Und das bedeutet auf allen 4 Tabellenebenen.

Natürlich ist der gemeinsame (Kernel) Teil immer in allen Adressräumen vorhanden, also gibt es tatsächlich einige Sharing, aber der Speicher dort ist nur für den Kernel selbst zugänglich.

Abgesehen davon, tatsächlich hat jeder Prozess seine eigenen Seitentabellen ziemlich viel und es gibt kein Problem mit allen 2 Adressen in einem von ihnen. Zumindest gibt es keine besondere Einschränkung seitens der CPU, obwohl es seitens des Betriebssystems sein kann.

Verwandte Themen