الحصول على حجم الصفحة

تعرض هذه الصفحة الطرق المختلفة للحصول على حجم صفحة kernel المستخدَم في الجهاز. يمكنك استخدام "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

يعرض الحقل 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

تحقَّق من إعدادات kernel لحجم الصفحة في الملف الزائف /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 الملفات بتنسيق سداسي عشري أو عشري أو بتنسيقات أخرى.
  • تُفرِغ -N8 -j56 البادئة التي تتألف من 8 بايت بدءًا من الإزاحة 56 في الملف، التي تتوافق مع AT_PAGESZ.
  • يُعدّ -td8 تنسيقًا للقيمة بصفتها عددًا صحيحًا عشريًا مكوّنًا من 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. يحتوي البتّ الأول على القيمة 0، ويحوي البتّ الثاني على القيمة 1. عند قراءة هاتين البتتين، نحصل على 10b أو 2 بالنظام العشري. استنادًا إلى قيمة هذه الوحدات بت، يمكنك تحديد حجم صفحة kernel:

  • 0 - غير محدّد
  • 1 - 4 كيلوبايت
  • 2 - 16 كيلوبايت
  • 3 - 64 كيلوبايت

لمزيد من المعلومات، يُرجى الاطّلاع على مستندات Linux kernel.