GNU/Linux >> LINUX-Kenntnisse >  >> Linux

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

Sie können die Standardseitengröße eines Systems herausfinden, indem Sie seine Konfiguration über getconf abfragen Befehl:

$ getconf PAGE_SIZE
4096

oder

$ getconf PAGESIZE
4096

HINWEIS: Die obigen Einheiten sind in der Regel in Byte, also entspricht 4096 4096 Byte 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 ergibt das Schalten 4096?

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

$ echo "2^12" | bc
4096

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 (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:

  • Normal große Seiten, die meiner Meinung nach standardmäßig auf allen Architekturen 4 KB groß sind, obwohl einige Architekturen andere Werte zulassen, z. 16kB auf ARM64 oder 8kB, 16kB oder 64kB auf IA64. Diese entsprechen der tiefsten Ebene der Deskriptoren auf der MMU (was Linux PTE nennt).
  • Riesige Seiten, wenn einkompiliert (CONFIG_HUGETLB_PAGE erforderlich ist, und CONFIG_HUGETLBFS auch für die meisten Anwendungen). Dies entspricht der zweittiefsten Ebene der MMU-Deskriptoren (was Linux PMD nennt) (oder tut es zumindest normalerweise, ich weiß nicht, ob dies für alle Architekturen gilt).

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

  • Eine größere Seitengröße bedeutet mehr Verschwendung, wenn eine Seite teilweise verwendet wird, sodass dem System früher der Arbeitsspeicher ausgeht.
  • Eine tiefere MMU-Deskriptorebene bedeutet mehr Kernel-Speicher für Seitentabellen.
  • Eine tiefere MMU-Deskriptorebene bedeutet, dass mehr Zeit mit dem Durchlaufen von Seitentabellen verbracht wird.

Die Vorteile größerer Seitengrößen sind für die meisten Anwendungen winzig, während die Kosten beträchtlich sind. Aus diesem Grund verwenden die meisten Systeme nur Seiten mit normaler Größe.

Mit dem getconf können Sie die (normale) Seitengröße auf Ihrem System abfragen Dienstprogramm oder die C-Funktion sysconf .

$ getconf PAGE_SIZE
4096

Um riesige Seiten zu verwenden, muss hugetlbfs gemountet werden Dateisystem und mmap ping-Dateien dort.


Linux
  1. Wie viel Auslagerungsspeicher muss für Oracle Database unter Linux hinzugefügt werden?

  2. Wie portabel ist mmap?

  3. malloc gibt Arbeitsspeicher oder virtuellen Adressraum zurück

  4. Wie greife ich unter Linux auf physische Adressen aus dem Benutzerbereich zu?

  5. Wie wird Speicher zugewiesen, der auf die Seitengröße ausgerichtet ist?

So finden Sie die IP-Adresse unter Linux

So erhöhen Sie den virtuellen Speicherplatz der VM auf VirtualBox

So erhöhen Sie die Festplattengröße Ihrer vorhandenen virtuellen Maschinen in VirtualBox

So ändern Sie die IP-Adresse unter Linux

Linux – Wie wird ein virtueller 64-Bit-Prozess-Adressraum in Linux aufgeteilt?

So erhöhen Sie den virtuellen Speicherplatz der VM auf VirtualBox und VMware