Conoscere le dimensioni della pagina

Questa pagina elenca i diversi modi per ottenere le dimensioni della pagina del kernel utilizzate nel dispositivo. Per connetterti al dispositivo, puoi usare adb.

$ adb shell

Utilizzare il codice di programmazione

In C++, preferisci getpagesize(2):

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

In Java, puoi utilizzare la configurazione di sistema:

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

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

Utilizzare il comando getconf

Utilizza il comando getconf per ottenere le dimensioni della pagina, come mostrato di seguito:

$ getconf PAGE_SIZE
4096

Utilizza lo pseudo file /proc//smaps

Il campo KernelPageSize nell'pseudo file /proc/<pid>/smaps mostra le dimensioni della pagina, come mostrato di seguito:

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

utilizza il flag linker LD_SHOW_AUXV=1

Utilizza il flag LD_SHOW_AUXV per stampare il vettore ausiliario del programma che sta per essere eseguito. Il campo AT_PAGESZ contiene le dimensioni della pagina, come mostrato di seguito:

$ 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

Utilizza il file pseudo /proc/config.gz

Controlla la configurazione del kernel per le dimensioni della pagina nel file pseudo/proc/config.gz. Le possibili configurazioni per le dimensioni di pagina sono:

  • CONFIG_ARM64_4K_PAGES=y: il kernel utilizza pagine da 4096 byte.
  • CONFIG_ARM64_16K_PAGES=y: il kernel utilizza pagine di 16384 byte.
  • CONFIG_ARM64_64K_PAGES=y: il kernel utilizza pagine di 65536 byte.
$ zcat /proc/config.gz | grep "CONFIG_ARM64_[164K]*_PAGES=y"
CONFIG_ARM64_16K_PAGES=y

Utilizzare il vettore ausiliario

Quando viene eseguito un programma, il kernel alloca e inizializza il vettore ausiliario con informazioni, come le dimensioni della pagina, utilizzate dal linker dinamico. Il vettore ausiliario può essere letto dallo pseudo file /proc/<pid>/auxv. Le dimensioni della pagina dal vettore ausiliario del processo 1 possono essere visualizzate come segue:

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

Dove:

  • od esegue il dump dei file in formato esadecimale, decimale o in altri formati.
  • -N8 -j56 esegue il dump degli 8 byte a partire dall'offset 56 nel file, corrispondente a AT_PAGESZ.
  • -td8 formatta il valore come numero intero decimale di 8 byte.
  • -An consente di visualizzare solo il valore, non il relativo indirizzo.

Leggere da un'immagine del kernel

Puoi leggere l'intestazione di un'immagine del kernel per determinare le dimensioni della pagina. Questo è utile nel bootloader, se devi sapere quale tipo di kernel hai avviato.

La dimensione della pagina è nel 25° byte dell'intestazione del kernel:

 $ 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 questo esempio, il valore è 0x0C = 0000 1100b. Il bit 1 ha il valore 0 e il bit 2 ha il valore 1. Leggendo questi due bit, otteniamo 10b o 2 in decimale. In base al valore di questi bit, puoi determinare le dimensioni della pagina del kernel:

  • 0 - Non specificato
  • 1 - 4 KB
  • 2 - 16 KB
  • 3 - 64 KB

Per ulteriori informazioni, consulta la documentazione del kernel Linux.