Cómo obtener el tamaño de la página

En esta página, se enumeran las diferentes formas de obtener el tamaño de la página del kernel que se usa en el dispositivo. Para conectarte al dispositivo, puedes usar adb.

$ adb shell

Usa código de programación

En C++, prefiere getpagesize(2):

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

En Java, puedes usar la configuración del sistema:

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

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

Usa el comando getconf

Usa el comando getconf para obtener el tamaño de la página, que se muestra a continuación:

$ getconf PAGE_SIZE
4096

Usar el seudoarchivo /proc//smaps

El campo KernelPageSize en el archivo pseudo /proc/<pid>/smaps muestra el tamaño de la página, como se muestra a continuación:

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

Usa la marca del vinculador LD_SHOW_AUXV=1

Usa la marca LD_SHOW_AUXV para imprimir el vector auxiliar del programa que se ejecutará. El campo AT_PAGESZ contiene el tamaño de la página, como se muestra a continuación:

$ 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

Usa el pseudoarchivo /proc/config.gz

Verifica la configuración del kernel para el tamaño de página en el archivo pseudo /proc/config.gz. Las configuraciones posibles para el tamaño de la página son las siguientes:

  • CONFIG_ARM64_4K_PAGES=y: El kernel usa páginas de 4,096 bytes.
  • CONFIG_ARM64_16K_PAGES=y: El kernel usa páginas de 16,384 bytes.
  • CONFIG_ARM64_64K_PAGES=y: El kernel usa páginas de 65,536 bytes.
$ zcat /proc/config.gz | grep "CONFIG_ARM64_[164K]*_PAGES=y"
CONFIG_ARM64_16K_PAGES=y

Usa el vector auxiliar

Cuando se ejecuta un programa, el kernel asigna e inicializa el vector auxiliar con información, como el tamaño de la página, que usa el vinculador dinámico. El vector auxiliar se puede leer desde el archivo pseudo /proc/<pid>/auxv. El tamaño de la página del vector auxiliar del proceso 1 se puede mostrar de la siguiente manera:

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

donde:

  • od vuelca archivos en formato hexadecimal, decimal y otros.
  • -N8 -j56 vuelca los 8 bytes a partir del desplazamiento 56 en el archivo, que corresponde a AT_PAGESZ.
  • -td8 establece el valor como un número entero decimal de 8 bytes.
  • -An hace que solo se muestre el valor, no su dirección.

Cómo leer desde una imagen de kernel

Puedes leer el encabezado de una imagen de kernel para determinar el tamaño de la página. Esto es útil en el bootloader si necesitas saber qué tipo de kernel estás iniciando.

El tamaño de la página se encuentra en el byte 25 del encabezado 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

En este ejemplo, el valor es 0x0C = 0000 1100b. El bit 1 tiene el valor 0, y el bit 2 tiene el valor 1. Si leemos estos dos bits, obtenemos 10b o 2 en decimal. En función del valor de estos bits, puedes determinar el tamaño de la página del kernel:

  • 0 - Sin especificar
  • 1: 4 KB
  • 2: 16 KB
  • 3: 64 KB

Para obtener más información, consulta la documentación del kernel de Linux.