이 페이지에는 기기에 사용된 커널 페이지 크기를 가져오는 다양한 방법이 나열되어 있습니다. 기기에 연결하려면 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
- 4KB2
- 16KB3
- 64KB
자세한 내용은 Linux 커널 문서를 참고하세요.