自 2025 年 3 月 27 日起,我们建议您使用 android-latest-release
而非 aosp-main
构建 AOSP 并为其做出贡献。如需了解详情,请参阅 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
转储文件。
-N8 -j56
会将从偏移量 56 开始的 8 个字节转储到文件中,对应于 AT_PAGESZ
。
-td8
会将值的格式设置为十进制 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
。通过读取这两位,我们会以十进制形式得到 10b
或 2
。根据这些位的值,您可以确定内核页面大小:
0
- 不明
1
- 4 KB
2
- 16 KB
3
- 64 KB
如需了解详情,请参阅 Linux 内核文档
本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2025-03-26。
[[["易于理解","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"]],["最后更新时间 (UTC):2025-03-26。"],[],[],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)"]]