Saber o tamanho da página

Esta página lista as diferentes maneiras de acessar o tamanho da página do kernel usado no dispositivo. Para se conectar ao dispositivo, use adb.

$ adb shell

Usar código de programação

Em C++, prefira getpagesize(2):

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

Em Java, é possível usar a configuração do sistema:

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

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

Usar o comando getconf

Use o comando getconf para conferir o tamanho da página, conforme mostrado a seguir:

$ getconf PAGE_SIZE
4096

Use o /proc//smaps pseudo file

O campo KernelPageSize no pseudoarquivo /proc/<pid>/smaps mostra o tamanho da página, conforme mostrado abaixo:

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

Usar a flag de vinculador LD_SHOW_AUXV=1.

Use a flag LD_SHOW_AUXV para imprimir o vetor auxiliar do programa que está prestes a ser executado. O campo AT_PAGESZ contém o tamanho da página, mostrado da seguinte maneira:

$ 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

Usar o pseudoarquivo /proc/config.gz

Verifique a configuração do kernel para o tamanho da página no pseudoarquivo /proc/config.gz. As configurações possíveis para o tamanho da página são:

  • CONFIG_ARM64_4K_PAGES=y: o kernel usa páginas de 4.096 bytes.
  • CONFIG_ARM64_16K_PAGES=y: o kernel usa páginas de 16.384 bytes.
  • CONFIG_ARM64_64K_PAGES=y: o kernel usa páginas de 65.536 bytes.
$ zcat /proc/config.gz | grep "CONFIG_ARM64_[164K]*_PAGES=y"
CONFIG_ARM64_16K_PAGES=y

Usar o vetor auxiliar

Quando um programa é executado, o kernel aloca e inicializa o vetor auxiliar com informações, como o tamanho da página, que é usado pelo vinculador dinâmico. O vetor auxiliar pode ser lido do pseudoarquivo /proc/<pid>/auxv. O tamanho da página do vetor auxiliar do processo 1 pode ser mostrado da seguinte maneira:

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

Em que:

  • od despeja arquivos em formato hexadecimal, decimal ou outros.
  • -N8 -j56 descarta os 8 bytes a partir do deslocamento 56 no arquivo, correspondente a AT_PAGESZ.
  • -td8 formata o valor como um número inteiro decimal de 8 bytes.
  • -An faz com que apenas o valor seja mostrado, não o endereço.

Ler de uma imagem do kernel

É possível ler o cabeçalho de uma imagem do kernel para determinar o tamanho da página. Isso é útil no carregador de inicialização, se você precisar saber qual tipo de kernel está sendo inicializado.

O tamanho da página está no 25º byte do cabeçalho do 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

Neste exemplo, o valor é 0x0C = 0000 1100b. O bit 1 tem o valor 0, e o bit 2 tem o valor 1. Ao ler esses dois bits, obtemos 10b ou 2 em decimal. Com base no valor desses bits, é possível determinar o tamanho da página do kernel:

  • 0: não especificado
  • 1 – 4 KB
  • 2 - 16 KB
  • 3 a 64 KB

Para mais informações, consulte a documentação do kernel do Linux.