Questa pagina elenca i diversi modi per ottenere le dimensioni della pagina del kernel utilizzate nel
dispositivo. Per connetterti al dispositivo, puoi utilizzare 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/
Il campo KernelPageSize nel file pseudo /proc/<pid>/smaps mostra le dimensioni della pagina, come segue:
$ grep KernelPageSize /proc/1/smaps
KernelPageSize: 4 kB
Utilizza il flag del 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,
visualizzate nel seguente modo:
$ 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 lo pseudo file /proc/config.gz
Controlla la configurazione del kernel per le dimensioni della pagina nel pseudo file
/proc/config.gz. Le configurazioni possibili per le dimensioni della pagina sono:
CONFIG_ARM64_4K_PAGES=y: il kernel utilizza pagine di 4096 byte.CONFIG_ARM64_16K_PAGES=y: il kernel utilizza pagine di 16.384 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, ad esempio le dimensioni della pagina, utilizzate dal linker
dinamico. Il vettore ausiliario può essere letto dallo pseudo file
/proc/<pid>/auxv. La dimensione della pagina del vettore ausiliario del processo 1 può essere
mostrata come segue:
$ od -N8 -j56 -td8 -An /proc/1/auxv
4096
Dove:
odesegue il dump dei file in formato esadecimale, decimale o in altri formati.-N8 -j56scarica nel file gli 8 byte a partire dall'offset 56, corrispondenti aAT_PAGESZ.-td8formatta il valore come un numero intero decimale di 8 byte.-Anfa sì che venga visualizzato solo il valore, non il suo indirizzo.
Leggere da un'immagine del kernel
Puoi leggere l'intestazione di un'immagine del kernel per determinare le dimensioni della pagina. Questa operazione è utile nel bootloader, se devi sapere quale tipo di kernel stai avviando.
Le dimensioni della pagina si trovano 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
formato decimale. In base al valore di questi bit, puoi determinare la dimensione della pagina del kernel:
0- Motivo imprecisato1- 4 KB2- 16 kB3- 64 KB
Per saperne di più, consulta la documentazione del kernel Linux