دریافت اندازه صفحه

این صفحه روش‌های مختلف دریافت اندازه صفحه هسته مورد استفاده در دستگاه را فهرست می‌کند. برای متصل شدن به دستگاه، می‌توانید از adb استفاده کنید.

$ adb shell

استفاده از کد برنامه‌نویسی

در C++‎،‏ getpagesize(2) را ترجیح دهید:

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

در جاوا، می‌توانید از پیکربندی سیستم استفاده کنید:

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

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

استفاده از فرمان getconf

از فرمان getconf برای دریافت اندازه صفحه استفاده کنید، که به‌صورت زیر نشان داده می‌شود:

$ getconf PAGE_SIZE
4096

از فایل شبه /proc//smaps استفاده کنید

فیلد KernelPageSize در فایل شبه /proc/<pid>/smaps اندازه صفحه را به‌صورت زیر نشان می‌دهد:

$ 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: هسته از صفحه‌های ۴۰۹۶ بایتی استفاده می‌کند.
  • ‫CONFIG_ARM64_16K_PAGES=y: هسته از صفحه‌های ۱۶۳۸۴ بایتی استفاده می‌کند.
  • ‫CONFIG_ARM64_64K_PAGES=y: هسته از صفحه‌های ۶۵۵۳۶ بایتی استفاده می‌کند.
$ zcat /proc/config.gz | grep "CONFIG_ARM64_[164K]*_PAGES=y"
CONFIG_ARM64_16K_PAGES=y

استفاده از بردار کمکی

وقتی برنامه‌ای اجرا می‌شود، هسته بردار کمکی را با اطلاعاتی مثل اندازه صفحه که توسط پیونددهنده پویا استفاده می‌شود اختصاص می‌دهد و مقداردهی اولیه می‌کند. بردار کمکی را می‌توان از فایل شبه /proc/<pid>/auxv خواند. اندازه صفحه از بردار کمکی فرایند ۱ می‌تواند به‌صورت زیر نشان داده شود:

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

مکان:

  • od فایل‌ها را در قالب‌های شانزده‌شانزدهی، اعشاری، یا قالب‌های دیگر تخلیه می‌کند.
  • ‫-N8 -j56 هشت بایت را که از افست ۵۶ شروع می‌شود در فایل تخلیه می‌کند، که مربوط به AT_PAGESZ است.
  • ‫-td8 مقدار را به‌عنوان عدد صحیح ۸ بایتی اعشاری قالب‌بندی می‌کند.
  • -An باعث می‌شود فقط مقدار نشان داده شود، نه نشانی آن.

خواندن از تصویر هسته

می‌توانید سرصفحه تصویر هسته را بخوانید تا اندازه صفحه را تعیین کنید. این کار در راه‌انداز سیستم مفید است، اگر لازم باشد بدانید چه نوع هسته‌ای را راه‌اندازی می‌کنید.

اندازه صفحه در بایت بیست‌وپنجم سرایند هسته قرار دارد:

 $ 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 است. بیت ۱ مقدار 0 و بیت ۲ مقدار 1 را دارد. با خواندن این دو بیت، 10b یا 2 را در مبنای ۱۰ به‌دست می‌آوریم. براساس مقدار این بیت‌ها، می‌توانید اندازه صفحه هسته را تعیین کنید:

  • 0 - نامشخص
  • 1 - ۴ کیلوبایت
  • ‫2 - ۱۶ کیلوبایت
  • ‫3 - ۶۴ کیلوبایت

برای اطلاعات بیشتر، مستندات هسته Linux را ببینید