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
입니다. 이 두 비트를 읽으면 십진수로 10b
또는 2
이 됩니다. 이러한 비트의 값을 기반으로 커널 페이지 크기를 확인할 수 있습니다.
0
- 지정되지 않음
1
- 4KB
2
- 16KB
3
- 64KB
자세한 내용은 Linux 커널 문서를 참고하세요.
이 페이지에 나와 있는 콘텐츠와 코드 샘플에는 콘텐츠 라이선스에서 설명하는 라이선스가 적용됩니다. 자바 및 OpenJDK는 Oracle 및 Oracle 계열사의 상표 또는 등록 상표입니다.
최종 업데이트: 2025-07-27(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-07-27(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)"]]