ページサイズの取得

このページでは、デバイスで使用されているカーネル ページサイズを取得するさまざまな方法をまとめています。デバイスに接続するには、adb を使用します。

$ adb shell

getconf コマンドの使用

次のように、getconf コマンドを使用するとページサイズを取得できます。

$ getconf PAGE_SIZE
4096

/proc/<pid>/smaps 疑似ファイルの使用

次のように、疑似ファイル /proc/<pid>/smapsKernelPageSize フィールドにはページサイズが表示されます。

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

LD_SHOW_AUXV=1 リンカーフラグの使用

LD_SHOW_AUXV フラグを使用すると、実行対象プログラムの補助ベクターを出力できます。次のように、AT_PAGESZ フィールドにはページサイズが含まれます。

$ 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

/proc/config.gz 疑似ファイルの使用

疑似ファイル /proc/config.gz で、カーネル設定のページサイズを確認します。利用可能なページサイズの設定は次のとおりです。

  • CONFIG_ARM64_4K_PAGES=y: カーネルが 4096 バイトのページを使用します。
  • CONFIG_ARM64_16K_PAGES=y: カーネルが 16384 バイトのページを使用します。
  • CONFIG_ARM64_64K_PAGES=y: カーネルが 65536 バイトのページを使用します。
$ zcat /proc/config.gz | grep "CONFIG_ARM64_[164K]*_PAGES=y"
CONFIG_ARM64_16K_PAGES=y

補助ベクターの使用

プログラムを実行すると、ページサイズなどの情報を基にカーネルによって補助ベクターの割り当てと初期化が行われ、それがダイナミック リンカーで使用されます。補助ベクターは疑似ファイル /proc/<pid>/auxv から読み込むことができます。プロセス 1 の補助ベクターのページサイズは、以下のように示すことができます。

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

詳細は次のとおりです。

  • od は、16 進数、10 進数、またはその他の形式でファイルをダンプします。
  • -N8 -j56 は、オフセット 56 で開始される 8 バイトを、AT_PAGESZ に対応するファイルにダンプします。
  • -td8 は 10 進数の 8 バイト整数として値をフォーマットします。
  • -An はアドレスではなく、値のみを表示します。