Sayfa boyutunu alma

Bu sayfada, cihazda kullanılan çekirdek sayfa boyutunu elde etmenin farklı yolları listelenmiştir. Cihaza bağlanmak için adb simgesini kullanabilirsiniz.

$ adb shell

Programlama kodu kullanma

C++'ta getpagesize(2)'yi tercih edin:

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

Java'da sistem yapılandırmasını kullanabilirsiniz:

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

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

getconf komutunu kullanma

Aşağıdaki şekilde gösterilen sayfa boyutunu almak için getconf komutunu kullanın:

$ getconf PAGE_SIZE
4096

/proc//smaps sözde dosyasını kullanın

/proc/<pid>/smaps sözde dosyasında KernelPageSize alanı sayfa boyutunu gösterir ve aşağıdaki gibi gösterilir:

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

LD_SHOW_AUXV=1 bağlayıcı işaretini kullanın

Yürütülmek üzere olan programın yardımcı vektörünü yazdırmak için LD_SHOW_AUXV işaretini kullanın. AT_PAGESZ alanı, sayfa boyutunu içerir ve aşağıdaki gibi gösterilir:

$ 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 sözde dosyasını kullanma

Sözde dosyadaki sayfa boyutu için çekirdek yapılandırmasını kontrol edin /proc/config.gz. Sayfa boyutu için olası yapılandırmalar şunlardır:

  • CONFIG_ARM64_4K_PAGES=y: çekirdek 4.096 baytlık sayfalar kullanır.
  • CONFIG_ARM64_16K_PAGES=y: Çekirdek 16.384 baytlık sayfalar kullanır.
  • CONFIG_ARM64_64K_PAGES=y: Çekirdek 65.536 baytlık sayfalar kullanır.
$ zcat /proc/config.gz | grep "CONFIG_ARM64_[164K]*_PAGES=y"
CONFIG_ARM64_16K_PAGES=y

Yardımcı vektörü kullanma

Bir program yürütüldüğünde çekirdek, yardımcı vektörü dinamik bağlayıcı tarafından kullanılan bilgilerle (ör. sayfa boyutu) ayırır ve başlatır. Yardımcı vektör, sözde dosyadan (/proc/<pid>/auxv) okunabilir. 1. işlemin yardımcı vektöründeki sayfa boyutu aşağıdaki gibi gösterilebilir:

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

Nerede:

  • od; dosyaları onaltılık, ondalık veya başka biçimlerde dökümler.
  • -N8 -j56, 56 ofsetinden itibaren AT_PAGESZ'a karşılık gelen 8 baytı dosyaya aktarır.
  • -td8, değeri ondalık 8 baytlık bir tam sayı olarak biçimlendirir.
  • -An, adresinin değil yalnızca değerin gösterilmesine neden olur.

Bir çekirdek görüntüsünden okuma

Sayfa boyutunu belirlemek için çekirdek görüntüsünün başlığını okuyabilirsiniz. Bu, hangi tür bir çekirdeği başlattığınızı bilmeniz gerektiğinde önyükleyicide kullanışlıdır.

Sayfa boyutu, çekirdek başlığının 25. baytında yer alır:

 $ 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

Bu örnekte değer 0x0C = 0000 1100b'tır. Bit 1 0 değerine, bit 2 ise 1 değerine sahiptir. Bu iki biti okuyarak ondalık olarak 10b veya 2 elde ederiz. Bu bitlerin değerine bağlı olarak çekirdek sayfa boyutunu belirleyebilirsiniz:

  • 0 - Belirtilmedi
  • 1 - 4 KB
  • 2-16 KB
  • 3 - 64 KB

Daha fazla bilgi için Linux çekirdek dokümanlarına bakın