2025 年 3 月 27 日より、AOSP のビルドとコントリビューションには aosp-main
ではなく android-latest-release
を使用することをおすすめします。詳細については、AOSP の変更をご覧ください。
ページサイズの取得
コレクションでコンテンツを整理
必要に応じて、コンテンツの保存と分類を行います。
このページでは、デバイスで使用されているカーネル ページサイズを取得するさまざまな方法をまとめています。デバイスに接続するには、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>/smaps
の KernelPageSize
フィールドにはページサイズが表示されます。
$ 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 カーネルに関するドキュメントをご覧ください。
このページのコンテンツやコードサンプルは、コンテンツ ライセンスに記載のライセンスに従います。Java および OpenJDK は Oracle および関連会社の商標または登録商標です。
最終更新日 2025-03-26 UTC。
[[["わかりやすい","easyToUnderstand","thumb-up"],["問題の解決に役立った","solvedMyProblem","thumb-up"],["その他","otherUp","thumb-up"]],[["必要な情報がない","missingTheInformationINeed","thumb-down"],["複雑すぎる / 手順が多すぎる","tooComplicatedTooManySteps","thumb-down"],["最新ではない","outOfDate","thumb-down"],["翻訳に関する問題","translationIssue","thumb-down"],["サンプル / コードに問題がある","samplesCodeIssue","thumb-down"],["その他","otherDown","thumb-down"]],["最終更新日 2025-03-26 UTC。"],[],[],null,["# Get the page size\n\nThis page lists the different ways to get the kernel page size used in the\ndevice. To connect to the device, you can use `adb`. \n\n $ adb shell\n\nUse programming code\n--------------------\n\nIn C++, prefer `getpagesize(2)`: \n\n # include \u003cunistd.h\u003e\n ...\n ... = getpagesize();\n\nIn Java, you can use system config: \n\n import android.system.Os;\n import android.system.OsConstants;\n\n ... = Os.sysconf(OsConstants._SC_PAGE_SIZE);\n\nUse the getconf command\n-----------------------\n\nUse the `getconf` command to get the page size, shown as follows: \n\n $ getconf PAGE_SIZE\n 4096\n\nUse the /proc//smaps pseudo file\n--------------------------------\n\nThe `KernelPageSize` field in the pseudo file `/proc/\u003cpid\u003e/smaps` shows the page\nsize, shown as follows: \n\n $ grep KernelPageSize /proc/1/smaps\n KernelPageSize: 4 kB\n\nUse the LD_SHOW_AUXV=1 linker flag\n----------------------------------\n\nUse the `LD_SHOW_AUXV` flag to print the auxiliary vector of the program\nthat is about to be executed. The `AT_PAGESZ` field contains the page size,\nshown as follows: \n\n $ LD_SHOW_AUXV=1 ls\n AT_SYSINFO_EHDR 0x7250460000\n AT_MINSIGSTKSZ 4720\n AT_HWCAP 0b11111111111111111111111111111111\n AT_PAGESZ 4096\n AT_CLKTCK 100\n AT_PHDR 0x5fda1e0040\n AT_PHENT 56\n AT_PHNUM 12\n AT_BASE 0x72502f8000\n AT_FLAGS 0\n AT_ENTRY 0x5fda210000\n AT_UID 0\n AT_EUID 0\n AT_GID 0\n AT_EGID 0\n AT_SECURE 0\n AT_RANDOM 0x7fc59d66f8\n AT_HWCAP2 0b100011001111111111\n AT_EXECFN \"/system/bin/ls\"\n AT_PLATFORM \"aarch64\"\n data dev. init vendor\n\nUse the /proc/config.gz pseudo file\n-----------------------------------\n\nCheck the kernel configuration for the page size in the pseudo file\n`/proc/config.gz`. The possible configurations for the page size are:\n\n- `CONFIG_ARM64_4K_PAGES=y`: the kernel uses 4096-byte pages.\n- `CONFIG_ARM64_16K_PAGES=y`: the kernel uses 16384-byte pages.\n- `CONFIG_ARM64_64K_PAGES=y`: the kernel uses 65536-byte pages.\n\n $ zcat /proc/config.gz | grep \"CONFIG_ARM64_[164K]*_PAGES=y\"\n CONFIG_ARM64_16K_PAGES=y\n\nUse the auxiliary vector\n------------------------\n\nWhen a program is executed, the kernel allocates and initializes the auxiliary\nvector with information, such as the page size, that is used by the dynamic\nlinker. The auxiliary vector can be read from the pseudo file\n`/proc/\u003cpid\u003e/auxv`. The page size from the auxiliary vector of process 1 can be\nshown as follows: \n\n $ od -N8 -j56 -td8 -An /proc/1/auxv\n 4096\n\nWhere:\n\n- `od` dumps files in hexadecimal, decimal or other formats.\n- `-N8 -j56` dumps the 8 bytes starting at offset 56 into the file, corresponding to `AT_PAGESZ`.\n- `-td8` formats the value as a decimal 8-byte integer.\n- `-An` causes just the value to be shown, not its address.\n\nRead from a kernel image\n------------------------\n\nYou can read a kernel image's header to determine the page size.\nThis is useful in the bootloader, if you need to know what type of kernel\nyou're booting.\n\nThe page size is in the 25th byte of the kernel header: \n\n $ file Image\n Image: Linux kernel ARM64 boot executable Image, little-endian, 16K pages\n\n $ hexdump -C Image -n 48\n 00000000 4d 5a 40 fa ff 7f 7b 14 00 00 00 00 00 00 00 00 |MZ@...{.........|\n 00000010 00 00 64 02 00 00 00 00 0c 00 00 00 00 00 00 00 |..d.............|\n 00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|\n 00000030\n\nIn this example, the value is `0x0C = 0000 1100b`. Bit 1 has the value `0`,\nand bit 2 has the value `1`. Reading these two bits, we get `10b` or `2` in\ndecimal. Based on the value of these bits, you can determine the kernel page\nsize:\n\n- `0` - Unspecified\n- `1` - 4 KB\n- `2` - 16 KB\n- `3` - 64 KB\n\nFor more information, see the\n[Linux kernel documentation](https://www.kernel.org/doc/Documentation/arm64/booting.txt)"]]