페이지 크기 가져오기

이 페이지에는 기기에 사용된 커널 페이지 크기를 가져오는 다양한 방법이 나열되어 있습니다. 기기에 연결하려면 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입니다. 이 두 비트를 읽으면 십진수로 10b 또는 2이 됩니다. 이러한 비트의 값을 기반으로 커널 페이지 크기를 확인할 수 있습니다.

  • 0 - 지정되지 않음
  • 1 - 4KB
  • 2 - 16KB
  • 3 - 64KB

자세한 내용은 Linux 커널 문서를 참고하세요.