Obtenir la taille de la page

Cette page liste les différentes façons d'obtenir la taille de page du noyau utilisée dans l'appareil. Pour vous connecter à l'appareil, vous pouvez utiliser adb.

$ adb shell

Utiliser un code de programmation

En C++, préférez 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 la page, comme indiqué ci-dessous :

$ getconf PAGE_SIZE
4096

Utiliser le pseudo-fichier /proc//smaps

Le champ KernelPageSize du pseudo-fichier /proc/<pid>/smaps indique la taille de la page, comme suit :

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

Utiliser l'indicateur d'éditeur de liens LD_SHOW_AUXV=1

Utilisez l'indicateur 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 indiqué ci-dessous :

$ 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 noyau pour la taille de la page dans le pseudo-fichier /proc/config.gz. Voici les configurations possibles pour la taille de la page :

  • 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 la page, qui sont utilisées par l'éditeur de liens dynamique. Le vecteur auxiliaire peut être lu à partir du pseudo-fichier /proc/<pid>/auxv. La taille de la 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 commençant à l'offset 56 dans le fichier, ce qui correspond à AT_PAGESZ.
  • -td8 met en forme la valeur en tant que nombre entier décimal de 8 octets.
  • -An n'affiche que la valeur, et non son adresse.

Lire à partir d'une image du noyau

Vous pouvez lire l'en-tête d'une image du noyau pour déterminer la taille de la page. Cela peut être utile dans le bootloader si vous avez besoin de savoir quel type de noyau vous démarrez.

La taille de la page se trouve au 25e octet de l'en-tête du noyau :

 $ 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 en décimal. En fonction de la valeur de ces bits, vous pouvez déterminer la taille de page du noyau :

  • 0 : non spécifié
  • 1 – 4 Ko
  • 2 – 16 ko
  • 3 – 64 Ko

Pour en savoir plus, consultez la documentation sur le noyau Linux.