Mendapatkan ukuran halaman

Halaman ini mencantumkan berbagai cara untuk mendapatkan ukuran halaman kernel yang digunakan di perangkat. Untuk terhubung ke perangkat, Anda dapat menggunakan adb.

$ adb shell

Menggunakan kode pemrograman

Di C++, utamakan getpagesize(2):

# include <unistd.h>
...
... = getpagesize();

Di Java, Anda dapat menggunakan konfigurasi sistem:

import android.system.Os;
import android.system.OsConstants;

... = Os.sysconf(OsConstants._SC_PAGE_SIZE);

Gunakan perintah getconf

Gunakan perintah getconf untuk mendapatkan ukuran halaman, seperti yang ditunjukkan berikut:

$ getconf PAGE_SIZE
4096

Menggunakan file semu /proc//smaps

Kolom KernelPageSize dalam file semu /proc/<pid>/smaps menunjukkan ukuran halaman, seperti yang ditunjukkan di bawah ini:

$ grep KernelPageSize /proc/1/smaps
KernelPageSize:        4 kB

Menggunakan flag linker LD_SHOW_AUXV=1

Gunakan tanda LD_SHOW_AUXV untuk mencetak vektor tambahan program yang akan dieksekusi. Kolom AT_PAGESZ berisi ukuran halaman, seperti yang ditunjukkan berikut:

$ 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

Menggunakan file semu /proc/config.gz

Periksa konfigurasi kernel untuk ukuran halaman dalam file pseudo /proc/config.gz. Konfigurasi yang mungkin untuk ukuran halaman adalah:

  • CONFIG_ARM64_4K_PAGES=y: kernel menggunakan halaman 4096 byte.
  • CONFIG_ARM64_16K_PAGES=y: kernel menggunakan halaman 16384 byte.
  • CONFIG_ARM64_64K_PAGES=y: kernel menggunakan halaman 65536 byte.
$ zcat /proc/config.gz | grep "CONFIG_ARM64_[164K]*_PAGES=y"
CONFIG_ARM64_16K_PAGES=y

Menggunakan vektor tambahan

Saat program dijalankan, kernel mengalokasikan dan menginisialisasi vektor tambahan dengan informasi, seperti ukuran halaman, yang digunakan oleh linker dinamis. Vektor tambahan dapat dibaca dari file semu /proc/<pid>/auxv. Ukuran halaman dari vektor tambahan proses 1 dapat ditampilkan sebagai berikut:

$ od -N8 -j56 -td8 -An /proc/1/auxv
4096

Dalam hal ini:

  • od menampilkan file dalam format heksadesimal, desimal, atau format lainnya.
  • -N8 -j56 mencadangkan 8 byte yang dimulai pada offset 56 ke dalam file, yang sesuai dengan AT_PAGESZ.
  • -td8 memformat nilai sebagai bilangan bulat 8-byte desimal.
  • -An hanya menyebabkan nilai ditampilkan, bukan alamatnya.

Membaca dari image kernel

Anda dapat membaca header image kernel untuk menentukan ukuran halaman. Hal ini berguna di bootloader, jika Anda perlu mengetahui jenis kernel yang Anda booting.

Ukuran halaman ada di byte ke-25 header kernel:

 $ 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

Dalam contoh ini, nilainya adalah 0x0C = 0000 1100b. Bit 1 memiliki nilai 0, dan bit 2 memiliki nilai 1. Dengan membaca kedua bit ini, kita akan mendapatkan 10b atau 2 dalam desimal. Berdasarkan nilai bit ini, Anda dapat menentukan ukuran halaman kernel:

  • 0 - Tidak ditentukan
  • 1 - 4 KB
  • 2 - 16 KB
  • 3 - 64 KB

Untuk mengetahui informasi selengkapnya, lihat dokumentasi kernel Linux