ページサイズの取得

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

$ adb shell

プログラミング コードの使用

C++ では、getpagesize(2) を優先します。

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

Java では、システム構成を使用できます。

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

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

getconf コマンドの使用

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

$ getconf PAGE_SIZE
4096

/proc//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 はアドレスではなく、値のみを表示します。

カーネル イメージからの読み取り

カーネル イメージのヘッダーを読み取ることで、ページサイズを確認できます。ブートローダーで起動中のカーネルタイプを知る必要がある場合に役立ちます。

ページサイズは、カーネル ヘッダーの 25 バイト目にあります。

 $ 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

この例での値は 0x0C = 0000 1100b です。ビット 1 の値は 0、ビット 2 の値は 1 です。これら 2 つのビットを読み取ると 10b となり、10 進数では 2 となります。これらのビットの値に基づいて、カーネルページのサイズを確認できます。

  • 0 - 不明
  • 1 - 4 KB
  • 2 - 16 KB
  • 3 - 64 KB

詳しくは、Linux カーネルに関するドキュメントをご覧ください。