Seitengröße abrufen

Auf dieser Seite werden die verschiedenen Möglichkeiten zum Abrufen der im Gerät verwendeten Kernel-Seitengröße aufgeführt. Sie können adb verwenden, um eine Verbindung zum Gerät herzustellen.

$ adb shell

Programmiercode verwenden

In C++ wird getpagesize(2) bevorzugt:

# include <unistd.h>
...
... = getpagesize();

In Java können Sie die Systemkonfiguration verwenden:

import android.system.Os;
import android.system.OsConstants;

... = Os.sysconf(OsConstants._SC_PAGE_SIZE);

getconf-Befehl verwenden

Verwenden Sie den Befehl getconf, um die Seitengröße abzurufen. Das wird so dargestellt:

$ getconf PAGE_SIZE
4096

Die Pseudodatei /proc//smaps verwenden

Das Feld KernelPageSize in der Pseudodatei /proc/<pid>/smaps enthält die Seitengröße, wie unten dargestellt:

$ grep KernelPageSize /proc/1/smaps
KernelPageSize:        4 kB

Linker-Flag LD_SHOW_AUXV=1 verwenden

Mit dem Flag LD_SHOW_AUXV können Sie den Hilfsvektor des Programms ausgeben, das ausgeführt werden soll. Das Feld AT_PAGESZ enthält die Seitengröße, die so dargestellt wird:

$ LD_SHOW_AUXV=1 ls
AT_SYSINFO_EHDR      0x7250460000
AT_MINSIGSTKSZ       4720
AT_HWCAP             0b11111111111111111111111111111111
AT_PAGESZ            4096
AT_CLKTCK            100
AT_PHDR              0x5fda1e0040
AT_PHENT             56
AT_PHNUM             12
AT_BASE              0x72502f8000
AT_FLAGS             0
AT_ENTRY             0x5fda210000
AT_UID               0
AT_EUID              0
AT_GID               0
AT_EGID              0
AT_SECURE            0
AT_RANDOM            0x7fc59d66f8
AT_HWCAP2            0b100011001111111111
AT_EXECFN            "/system/bin/ls"
AT_PLATFORM          "aarch64"
data            dev.        init    vendor

Die Pseudodatei „/proc/config.gz“ verwenden

Prüfen Sie die Kernelkonfiguration für die Seitengröße in der Pseudodatei /proc/config.gz. Folgende Konfigurationen für die Seitengröße sind möglich:

  • CONFIG_ARM64_4K_PAGES=y: Der Kernel verwendet 4.096 Byte große Seiten.
  • CONFIG_ARM64_16K_PAGES=y: Der Kernel verwendet 16.384 Byte große Seiten.
  • CONFIG_ARM64_64K_PAGES=y: Der Kernel verwendet 65.536-Byte-Seiten.
$ zcat /proc/config.gz | grep "CONFIG_ARM64_[164K]*_PAGES=y"
CONFIG_ARM64_16K_PAGES=y

Hilfsvektor verwenden

Wenn ein Programm ausgeführt wird, weist der Kernel dem Hilfsvektor Informationen wie die Seitengröße zu und initialisiert ihn damit. Diese Informationen werden vom dynamischen Linker verwendet. Der Hilfsvektor kann aus der Pseudodatei /proc/<pid>/auxv gelesen werden. Die Seitengröße aus dem Hilfsvektor von Prozess 1 kann so dargestellt werden:

$ od -N8 -j56 -td8 -An /proc/1/auxv
4096

Dabei gilt:

  • od gibt Dateien im Hexadezimal-, Dezimal- oder anderen Formaten aus.
  • -N8 -j56 schreibt die 8 Byte ab dem Offset 56 in die Datei, was AT_PAGESZ entspricht.
  • -td8 formatiert den Wert als dezimale 8‑Byte-Ganzzahl.
  • -An bewirkt, dass nur der Wert und nicht die Adresse angezeigt wird.

Aus einem Kernel-Image lesen

Sie können den Header eines Kernel-Images lesen, um die Seitengröße zu ermitteln. Dies ist im Bootloader nützlich, wenn Sie wissen müssen, welcher Kerneltyp gebootet wird.

Die Seitengröße befindet sich im 25. Byte des Kernel-Headers:

 $ file Image
Image: Linux kernel ARM64 boot executable Image, little-endian, 16K pages

 $ hexdump -C Image -n 48
00000000  4d 5a 40 fa ff 7f 7b 14  00 00 00 00 00 00 00 00  |MZ@...{.........|
00000010  00 00 64 02 00 00 00 00  0c 00 00 00 00 00 00 00  |..d.............|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030

In diesem Beispiel ist der Wert 0x0C = 0000 1100b. Bit 1 hat den Wert 0 und Bit 2 den Wert 1. Wenn wir diese beiden Bits lesen, erhalten wir 10b oder 2 in dezimaler Form. Anhand des Werts dieser Bits können Sie die Kernel-Seitengröße ermitteln:

  • 0 – Nicht angegeben
  • 1 – 4 KB
  • 2 – 16 KB
  • 3 – 64 KB

Weitere Informationen finden Sie in der Dokumentation zum Linux-Kernel.