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++, pilih 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);

Menggunakan perintah getconf

Gunakan perintah getconf untuk mendapatkan ukuran halaman, yang ditampilkan sebagai berikut:

$ getconf PAGE_SIZE
4096

Menggunakan file pseudo /proc//smaps

Kolom KernelPageSize dalam file pseudo /proc/<pid>/smaps menampilkan ukuran halaman, yang ditampilkan sebagai berikut:

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

Menggunakan flag penaut LD_SHOW_AUXV=1

Gunakan flag LD_SHOW_AUXV untuk mencetak vektor tambahan program yang akan dieksekusi. Kolom AT_PAGESZ berisi ukuran halaman, yang ditampilkan sebagai 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 pseudo /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 16.384 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 dieksekusi, kernel mengalokasikan dan menginisialisasi vektor bantuan dengan informasi, seperti ukuran halaman, yang digunakan oleh penaut dinamis. Vektor tambahan dapat dibaca dari file pseudo /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 membuang file dalam format heksadesimal, desimal, atau format lainnya.
  • -N8 -j56 membuang 8 byte mulai dari 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 sedang di-booting.

Ukuran halaman berada 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 dua bit ini, kita 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 informasi selengkapnya, lihat dokumentasi kernel Linux