Wie wird die Seitengröße im virtuellen Adressraum bestimmt?

Wie wird die Seitengröße im virtuellen Adressraum bestimmt?

Linux verwendet ein virtuelles Speichersystem, bei dem alle Adressen virtuelle und keine physischen Adressen sind. Diese virtuellen Adressen werden vom Prozessor in physische Adressen umgewandelt.

Um diese Übersetzung zu vereinfachen, werden virtueller und physischer Speicher in Seiten unterteilt. Jede dieser Seiten erhält eine eindeutige Nummer: die Seitenrahmennummer.

Einige Seitengrößen können 2 KB, 4 KB usw. betragen. Aber wie wird diese Seitengrößenzahl bestimmt? Wird sie von der Größe der Architektur beeinflusst? Ein 32-Bit-Bus verfügt beispielsweise über 4 GB Adressraum.

Antwort1

Sie können die Standardseitengröße eines Systems herausfinden, indem Sie dessen Konfiguration mit dem getconffolgenden Befehl abfragen:

$ getconf PAGE_SIZE
4096

oder

$ getconf PAGESIZE
4096

NOTIZ:Die obigen Einheiten sind normalerweise in Bytes angegeben, daher entspricht 4096 4096 Bytes oder 4 kB.

Dies ist hier im Quellcode des Linux-Kernels fest verdrahtet:

Beispiel

$ more /usr/src/kernels/3.13.9-100.fc19.x86_64/include/asm-generic/page.h
...
...
/* PAGE_SHIFT determines the page size */

#define PAGE_SHIFT  12
#ifdef __ASSEMBLY__
#define PAGE_SIZE   (1 << PAGE_SHIFT)
#else
#define PAGE_SIZE   (1UL << PAGE_SHIFT)
#endif
#define PAGE_MASK   (~(PAGE_SIZE-1))

Wie kommt man durch Verschieben auf 4096?

Wenn Sie Bits verschieben, führen Sie eine binäre Multiplikation mit 2 durch. Eine Verschiebung von Bits nach links ( 1 << PAGE_SHIFT) führt also tatsächlich zu einer Multiplikation von 2^12 = 4096.

$ echo "2^12" | bc
4096

Antwort2

Die Hardware (insbesondere dieMMU, das Teil der CPU ist) bestimmt, welche Seitengrößen möglich sind. Es besteht kein Zusammenhang mit der Prozessorregistergröße und nur ein indirekter Zusammenhang mit der Adressraumgröße (indem die MMU beides bestimmt).

Fast alle Architekturen unterstützen eine Seitengröße von 4 KB. Einige Architekturen unterstützen größere Seiten (und einige unterstützen auch kleinere Seiten), aber 4 KB ist ein weit verbreiteter Standard.

Linux unterstützt zwei Seitengrößen:

  • Seiten mit normaler Größe, die meines Wissens standardmäßig auf allen Architekturen 4 kB groß sind, obwohl einige Architekturen andere Werte zulassen, z. B. 16 kB aufARM64oder 8kB, 16kB oder 64kB aufIA64. Diese entsprechen der tiefsten Ebene der Deskriptoren in der MMU (was LinuxPTE).
  • Riesige Seiten, wenn einkompiliert ( CONFIG_HUGETLB_PAGEist notwendig und CONFIG_HUGETLBFSauch für die meisten Anwendungen). Dies entspricht der zweittiefsten Ebene der MMU-Deskriptoren (was Linux PMD nennt) (oder zumindest ist das normalerweise so, ich weiß nicht, ob das für alle Architekturen gilt).

Die Seitengröße ist ein Kompromiss zwischen Speicherbedarf, Speicherauslastung und Geschwindigkeit.

  • Eine größere Seitengröße bedeutet mehr Abfall, wenn eine Seite teilweise verwendet wird, sodass dem System schneller der Speicher ausgeht.
  • Eine tiefere MMU-Deskriptorebene bedeutet mehr Kernelspeicher für Seitentabellen.
  • Eine tiefere MMU-Deskriptorebene bedeutet, dass mehr Zeit für die Seitentabellendurchquerung aufgewendet wird.

Der Nutzen größerer Seitengrößen ist für die meisten Anwendungen gering, die Kosten jedoch beträchtlich. Aus diesem Grund verwenden die meisten Systeme nur Seiten normaler Größe.

Die (normale) Seitengröße auf Ihrem System können Sie abfragen mit demgetconfDienstprogramm oder die C-Funktionsysconf.

$ getconf PAGE_SIZE
4096

Große Seiten verwendenerfordert das Mounten des hugetlbfsDateisystems und mmapdas Pingen von Dateien dort.

Antwort3

Der Prozessor bestimmt die verfügbaren Seitengrößen. Für die meisten Zwecke beträgt die hardwareseitig implementierte Seitengröße auf x86- und x86_64-Prozessoren 4 KB. Das Betriebssystem kann jedoch bei Bedarf mehr als eine Seite gleichzeitig zuordnen und so effektiv 8-KB-, 16-KB- oder 32-KB-Seiten in Software implementieren.

Die x86- und x86_64-Prozessoren können neben den standardmäßigen 4-KB-Seiten auch 4-MB- und 2-MB-Seiten mischen. Wenn diese Funktion überhaupt genutzt wird, dann hauptsächlich, um Kernelspeicherplatz zuzuweisen.

Antwort4

Die Seitengröße hängt hauptsächlich von der Prozessorarchitektur ab. Unter x86 betrug die Seitengröße seit der Einführung des geschützten Modus beim 386-Prozessor 4 kB.

Im x64-Modus können auch riesige Seiten mit einer Größe von 2 MB erstellt werden. Allerdings ist deren Verwendung etwas komplizierter.

Weitere Informationen zur Seitengröße finden Sie inWikipedia-Artikel

verwandte Informationen