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 getconf
folgenden 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_PAGE
ist notwendig undCONFIG_HUGETLBFS
auch 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 demgetconf
Dienstprogramm oder die C-Funktionsysconf
.
$ getconf PAGE_SIZE
4096
Große Seiten verwendenerfordert das Mounten des hugetlbfs
Dateisystems und mmap
das 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