
Ich habe zwei Fragen zum virtuellen Adresslayout des Kernels auf x86- und x64-Systemen.
Soweit ich weiß, verwendet x86 das geteilte Speicherlayout, also Highmem und Lowmem.
Wenn ich das richtig verstehe, besteht der einzige Unterschied zwischen Highmem und Lowmem darin, ob eine 1:1-Zuordnung von virtuellen zu physischen Adressen vorliegt oder nicht.
Außerdem scheint es, dass Lowmem Code und Daten enthält, auf die das Kernelprogramm häufig zugreift, und Highmem die Seitentabellen oder Programmdaten auf Benutzerebene enthält, auf die nicht häufig zugegriffen wird.
Ich verstehe jedoch nicht, warum der x86-Kernel die virtuellen Adressräume aufteilt und die häufig aufgerufenen Daten und Codes im Lowmem-Speicher platziert. Was ist der Vorteil davon? Es scheint, dass unabhängig vom Speicherort des Kernelspeichers Page Table Walking aufgerufen werden sollte, um virtuelle in physische Zuordnungen zu erhalten. Wenn das richtig ist, scheint es keinen Vorteil von Highmem und Lowmem zu geben.
Hier ist meine erste Frage: Wenn LowMem die 1:1-Zuordnungen verwendet (d. h. physische Adresse + Konstante (0x80000000) => virtuelle Kerneladresse), warum verbringt die MMU dann ihre Zeit damit, die Seitentabelle zu durchlaufen, um die virtuellen zu physischen Zuordnungen zu ermitteln? Wenn möglich, können wir die MMU-Logik so ändern, dass nur die magische Konstante von der virtuellen Adresse abgezogen wird, um eine physische Adresse zu erhalten, wenn sie sich im LowMem-Bereich befindet. Oder gibt es andere Gründe, häufig aufgerufene Daten und Codes im LowMem zu platzieren? Und warum verwendet nur LowMem die 1:1-Zuordnungen...?
Meine zweite Frage lautet: „Wird im x64-Linux-System auch ein Mechanismus zur Speicheraufteilung zwischen LowMem und HighMem eingesetzt?“
Dank im Voraus
Antwort1
HochspeicherUndniedrigmembeziehen sich auf die Physical Address Extension auf x86-Prozessoren. Dieser Mechanismus ermöglicht es dem Prozessor, 64 GB Speicher zu adressieren, statt der üblichen 4 GB. Da der Befehlssatz jedoch unverändert bleibt und die Register und Zeiger immer noch 32 Bit lang sind, ist der virtuelle Adressraum immer noch auf 4 GB begrenzt. Maschinenbefehle verwenden immer virtuelle Adressen, keine physischen Adressen.
Dies hat zur Folge, dass "Highmem" erst dann direkt angesprochen werden kann, wenn es in den adressierbaren Bereich abgebildet wird. Aus diesem Grund verwendet nur Lowmem die 1:1-Abbildung; eine Abbildung auf Highmem ist nicht möglich.
Ihre nächste Frage war: Warum kann die MMU-Logik nicht vereinfacht werden, um Seitentabellen zu überspringen und eine einfache Subtraktion durchzuführen, um die physische Adresse zu erhalten? Die MMU ist in Hardware implementiert und darauf ausgelegt, Seitentabellen (und den TLB) für ihre Arbeit zu verwenden. Es gibt jedoch „riesige“ Seiten, die eine Ebene in den Seitentabellen überspringen, wodurch die Seitengröße auf dem x86 4 MB statt 4 kB beträgt.
Ihre letzte Frage: Ist der Speicher auch bei der x64-Architektur in Lowmem und Highmem aufgeteilt? Nein. Der PAE-Mechanismus ist ein bisschen ein Kludge, um die Lebensdauer des x86 zu verlängern. Das x64 mit seinen viel größeren Adressräumen (sowohl physisch als auch virtuell) braucht ihn nicht.