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

43

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

Um diese Übersetzung zu vereinfachen, sind der virtuelle und der physische Speicher in Seiten unterteilt. Jede dieser Seiten erhält eine eindeutige Nummer. die Seitenrahmennummer.

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

JohnMerlino
quelle

Antworten:

56

Sie können die Standardseitengröße eines Systems ermitteln, indem Sie seine Konfiguration mit dem folgenden getconfBefehl abfragen :

$ getconf PAGE_SIZE
4096

oder

$ getconf PAGESIZE
4096

ANMERKUNG: Die obigen Einheiten sind in der Regel in Bytes angegeben, sodass der 4096 4096 Bytes oder 4 KB entspricht.

Dies ist in der Linux-Kernel-Quelle hier 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 bringt Ihnen die Verlagerung 4096?

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

$ echo "2^12" | bc
4096
slm
quelle
2
Moderne Hardware unterstützt 2 MB und einige 1 GB Seitengröße. Kann "PAGE_SHIFT" für 2-MB-Seiten als Standard für den Kernel-Build auf 21 gesetzt werden?
ReverseFlow
2
@ReverseFlow Damit so etwas beantwortet wird, würde ich eine separate Frage stellen.
Kirill Bulygin
@sim, frage mich, warum hier Bit-Manipulationen verwendet werden? Ich habe gelesen, dass der Compiler Multiplikationen normalerweise in Bit-Manipulationen umwandelt, wodurch dieselbe Leistung erzielt wird.
InAFlash
17

Die Hardware (insbesondere die MMU , die Teil der CPU ist) bestimmt, welche Seitengrößen möglich sind. Es gibt keine Beziehung zur Prozessorregistergröße und nur eine indirekte Beziehung zur Adressraumgröße (insofern bestimmt die MMU beide).

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), 4 KB sind jedoch eine weit verbreitete Standardeinstellung.

Linux unterstützt zwei Seitengrößen:

  • Normalgroße Seiten, von denen ich glaube, dass sie standardmäßig auf allen Architekturen 4 KB groß sind, obwohl einige Architekturen andere Werte zulassen, z. B. 16 KB bei ARM64 oder 8 KB, 16 KB oder 64 KB bei IA64 . Diese entsprechen den tiefsten Deskriptoren der MMU (was Linux PTE nennt ).
  • Riesige Seiten , wenn sie kompiliert wurden ( CONFIG_HUGETLB_PAGEist notwendig und CONFIG_HUGETLBFSauch für die meisten Verwendungszwecke). Dies entspricht der zweittiefsten Ebene der MMU-Deskriptoren (was Linux PMD nennt) (oder zumindest normalerweise, ich weiß nicht, ob dies für alle Architekturen gilt).

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

  • Ein größeres Seitenformat bedeutet mehr Makulatur, wenn eine Seite teilweise verwendet wird, sodass dem System früher der Arbeitsspeicher ausgeht.
  • Eine tiefere MMU-Deskriptorstufe bedeutet mehr Kernelspeicher für Seitentabellen.
  • Eine tiefere Ebene des MMU-Deskriptors bedeutet mehr Zeit für das Durchlaufen von Seitentabellen.

Die Vorteile größerer Seitengrößen sind für die meisten Anwendungen gering, wohingegen die Kosten erheblich sind. Aus diesem Grund verwenden die meisten Systeme nur Seiten mit normaler Größe.

Sie können die (normale) Seitengröße auf Ihrem System mit dem getconfDienstprogramm oder der C-Funktion abfragen sysconf.

$ getconf PAGE_SIZE
4096

Wenn Sie große Seiten verwenden möchten, müssen Sie das hugetlbfsDateisystem bereitstellen und dort mmapPing-Dateien senden.

Gilles 'SO - hör auf böse zu sein'
quelle
Zu Ihrer Information: Für die Verwendung großer Seiten ist das Mounten von hugetlbfs nicht erforderlich, da Sie in diesem Kernel-Dokument unten auch Shared-Memory-Aufrufe oder ein mmap-Flag verwenden können. Interessanterweise können Sie auch transparente große Seiten aktivieren. Der Kernel konvertiert dann automatisch normale Seiten in große Seiten, wenn dies für alle Apps möglich ist.
Derobert
Dies ist die wirklich grundlegende Antwort. Linux ist nur dafür ausgelegt, die Paging-Hardware gut zu nutzen. Weitere Informationen zu Paging: stackoverflow.com/questions/18431261/how-does-x86-paging-work
Ciro Santilli Am
0

Die Seitengröße hängt hauptsächlich von der Prozessorarchitektur ab. Aus der Zeit des 386-Prozessors, der den geschützten Modus einführte, betrug die Seitengröße auf x86 4 kB.

Im x64-Modus können auch große Seiten mit einer Größe von 2 MB vorhanden sein. Die Verwendung dieser ist jedoch etwas kompliziert.

Weitere Informationen zur Seitengröße finden Sie im Wikipedia-Artikel

Tero Kilkanen
quelle
0

Der Prozessor bestimmt die verfügbaren Seitengrößen. In den meisten Fällen beträgt die in der Hardware implementierte Seitengröße auf x86- und x86_64-Prozessoren 4 KB. Das Betriebssystem kann jedoch mehr als eine Seite gleichzeitig zuweisen, wenn es dies wünscht, und dadurch effektiv 8-kb-, 16-kb- oder 32-kb-Seiten in der Software implementieren.

Die Prozessoren x86 und x86_64 können neben den Standard-4-KB-Seiten auch 4-MB- und 2-MB-Seiten mischen. Wenn diese Funktion überhaupt verwendet wird, wird sie hauptsächlich zum Zuweisen von Kernelspeicher verwendet.

Leslie
quelle