2009-02-23 12 views
6

Im Linux-Kernel ist mem_map das Array, das alle Deskriptoren der "struct page" enthält. Diese Seiten enthalten den 128MiB Speicher in LowMem für die dynamische Zuordnung von HighMem.Warum brauchen wir zone_highmem auf x86?

Da die Lowmem-Größe 1GiB ist, hat das mem_map Array nur 1GiB/4KiB = 256KiB Einträge. Wenn jede Eintragsgröße 32 Byte ist, dann ist die mem_map Speichergröße = 8MiB. Aber wenn wir mem_map verwenden könnten, um alle 4GiB physischen Speicher abzubilden (wenn wir so viel physischen Speicher auf x86-32 haben), dann würde das mem_map Array 32MiB belegen, das ist nicht viel Kernelspeicher (oder bin ich falsch?) .

Also meine Frage ist: Warum müssen wir diese 128MiB in niedrigen für indirekte highmem Mapping in erster Linie verwenden? Oder anders ausgedrückt, warum nicht alle diese max 4GiB physischen Speicher (wenn verfügbar) im Kernelraum direkt abbilden?

Hinweis: Wenn mein Verständnis der Kernelquelle oben falsch ist, korrigieren Sie bitte. Vielen Dank!

Antwort

1

Schau mal hier: http://www.xml.com/ldd/chapter/book/ch13.html

Kernel wenig Arbeitsspeicher ist die 'echte' Speicherkarte, adressiert mit 32-Bit-Zeiger auf x86.

Kernel high memory ist die 'virtuelle' Speicherzuordnung, adressiert mit virtuellen Strukturen auf x86.

Sie möchten nicht alles im Adressraum des Kernels abbilden, da Sie nicht immer alles adressieren können und Sie den größten Teil Ihres Speichers für virtuelle Speichersegmente benötigen (virtueller, seitenweiser Prozessraum).)

Zumindest, so lese ich es. Wow, das ist eine komplizierte Frage, die du gestellt hast.

mehr Verwirrung zu werfen, Kapitel 13 spricht über einige PCI-Geräte nicht die 32-Bit-Raum adressieren zu können, die die Entstehung meiner früheren Kommentar war:

Auf x86, ist einige Kernel-Speichernutzung beschränkt sich auf das erste Gigabyte an Speicher wegen der DMA-Adressierung betrifft. Ich bin mit dem Thema nicht 100% vertraut, aber es gibt einen Kompatibilitätsmodus für DMA auf dem PCI-Bus. Das ist vielleicht das, was Sie sehen.

0

3,6 GB ist nicht die Obergrenze bei der Verwendung von physikalischen Adresse Erweiterung, die häufig auf den meisten modernen x86-Boards, vor allem mit Speicher Hotplug benötigt wird.

0

Oder anders ausgedrückt, warum nicht alle diese max 4GiB physischen Speicher (wenn verfügbar) im Kernelraum direkt zuordnen?

Ein Grund ist der Userspace: Jeder Userspace-Prozess hat seinen eigenen virtuellen Adressraum. Angenommen, Sie haben 4 GB RAM auf x86. Wenn wir also vorschlagen, dass der Kernel 1 GB Speicher besitzt (~ 800 direkt gemappt + ~ 200 vmalloc), sollten alle anderen ~ 3Gb dynamisch verteilt zwischen Prozessen sein, die sich im Userspace drehen. Wie können Sie Ihre 4Gbs direkt zuordnen, wenn Sie mehrere Adressräume haben?

warum brauchen wir zone_highmem auf x86?

Der Grund ist der gleiche. Kernel reserviert nur ~ 800Mb für niedrige mem. Der gesamte andere Speicher wird nur bei Bedarf zugewiesen und mit einer bestimmten virtuellen Adresse verbunden.Wenn Sie zum Beispiel eine Binärdatei ausführen, wird ein neuer virtueller Adressraum erstellt und einige Seiten werden zum Speichern Ihres Binärcodes und Ihrer Daten (Heap, Stack ...) zugewiesen. Das Schlüsselattribut von high mem besteht also darin, dynamische Speicherzuweisungsanforderungen zu bedienen, Sie wissen nie im Voraus, was durch den Benutzerbereich ausgelöst wird ...