Cette page liste les différentes façons d'obtenir la taille de page du noyau utilisée sur l'appareil. Pour vous connecter à l'appareil, vous pouvez utiliser adb
.
$ adb shell
Utiliser du code de programmation
En C++, privilégiez getpagesize(2)
:
# include <unistd.h>
...
... = getpagesize();
En Java, vous pouvez utiliser la configuration système:
import android.system.Os;
import android.system.OsConstants;
... = Os.sysconf(OsConstants._SC_PAGE_SIZE);
Utiliser la commande "getconf"
Utilisez la commande getconf
pour obtenir la taille de page, comme illustré ci-dessous:
$ getconf PAGE_SIZE
4096
Utiliser le pseudo-fichier /proc//smaps
Le champ KernelPageSize
du pseudo-fichier /proc/<pid>/smaps
affiche la taille de la page, comme suit:
$ grep KernelPageSize /proc/1/smaps
KernelPageSize: 4 kB
Utiliser l'indicateur Linker LD_SHOW_AUXV=1
Utilisez l'option LD_SHOW_AUXV
pour imprimer le vecteur auxiliaire du programme qui est sur le point d'être exécuté. Le champ AT_PAGESZ
contient la taille de la page, comme suit:
$ 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
Utiliser le pseudo-fichier /proc/config.gz
Vérifiez la configuration du kernel pour la taille de page dans le pseudo-fichier /proc/config.gz
. Les configurations possibles pour la taille de page sont les suivantes:
CONFIG_ARM64_4K_PAGES=y
: le noyau utilise des pages de 4 096 octets.CONFIG_ARM64_16K_PAGES=y
: le noyau utilise des pages de 16 384 octets.CONFIG_ARM64_64K_PAGES=y
: le noyau utilise des pages de 65 536 octets.
$ zcat /proc/config.gz | grep "CONFIG_ARM64_[164K]*_PAGES=y"
CONFIG_ARM64_16K_PAGES=y
Utiliser le vecteur auxiliaire
Lorsqu'un programme est exécuté, le noyau alloue et initialise le vecteur auxiliaire avec des informations, telles que la taille de page, qui sont utilisées par le liant dynamique. Le vecteur auxiliaire peut être lu à partir du pseudo-fichier /proc/<pid>/auxv
. La taille de page du vecteur auxiliaire du processus 1 peut être représentée comme suit:
$ od -N8 -j56 -td8 -An /proc/1/auxv
4096
Où :
od
vide les fichiers au format hexadécimal, décimal ou autre.-N8 -j56
vide les huit octets à partir du décalage 56 dans le fichier, ce qui correspond àAT_PAGESZ
.-td8
met en forme la valeur sous la forme d'un entier décimal de 8 octets.-An
n'affiche que la valeur, et non son adresse.
Lire à partir d'une image de noyau
Vous pouvez lire l'en-tête d'une image de kernel pour déterminer la taille de page. Ceci est utile dans le bootloader, si vous avez besoin de savoir quel type de noyau vous démarrez.
La taille de la page se trouve dans le 25e octet de l'en-tête du 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
Dans cet exemple, la valeur est 0x0C = 0000 1100b
. Le bit 1 a la valeur 0
et le bit 2 a la valeur 1
. En lisant ces deux bits, nous obtenons 10b
ou 2
au format décimal. En fonction de la valeur de ces bits, vous pouvez déterminer la taille de page du kernel:
0
: aucune raison spécifiée1
- 4 Ko2
: 16 ko3
: 64 Ko
Pour en savoir plus, consultez la documentation du noyau Linux.