Lấy kích thước trang

Trang này liệt kê các cách khác nhau để lấy kích thước trang của nhân được dùng trong thiết bị. Để kết nối với thiết bị, bạn có thể dùng adb.

$ adb shell

Sử dụng mã lập trình

Trong C++, hãy ưu tiên getpagesize(2):

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

Trong Java, bạn có thể sử dụng cấu hình hệ thống:

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

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

Sử dụng lệnh getconf

Sử dụng lệnh getconf để lấy kích thước trang, như minh hoạ dưới đây:

$ getconf PAGE_SIZE
4096

Sử dụng tệp giả /proc//smaps

Trường KernelPageSize trong tệp giả /proc/<pid>/smaps cho biết kích thước trang, như sau:

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

Sử dụng cờ trình liên kết LD_SHOW_AUXV=1

Sử dụng cờ LD_SHOW_AUXV để in vectơ phụ của chương trình sắp được thực thi. Trường AT_PAGESZ chứa kích thước trang, được hiển thị như sau:

$ 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

Sử dụng tệp giả /proc/config.gz

Kiểm tra cấu hình kernel cho kích thước trang trong tệp giả /proc/config.gz. Bạn có thể thiết lập kích thước trang theo các cấu hình sau:

  • CONFIG_ARM64_4K_PAGES=y: hạt nhân sử dụng các trang có kích thước 4096 byte.
  • CONFIG_ARM64_16K_PAGES=y: hạt nhân sử dụng các trang có kích thước 16384 byte.
  • CONFIG_ARM64_64K_PAGES=y: hạt nhân sử dụng các trang 65536 byte.
$ zcat /proc/config.gz | grep "CONFIG_ARM64_[164K]*_PAGES=y"
CONFIG_ARM64_16K_PAGES=y

Sử dụng vectơ phụ

Khi một chương trình được thực thi, nhân sẽ phân bổ và khởi tạo vectơ phụ bằng thông tin, chẳng hạn như kích thước trang, được trình liên kết động sử dụng. Bạn có thể đọc vectơ phụ trợ từ tệp giả /proc/<pid>/auxv. Kích thước trang từ vectơ phụ của quy trình 1 có thể được hiển thị như sau:

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

Trong trường hợp:

  • od kết xuất tệp ở định dạng thập lục phân, thập phân hoặc các định dạng khác.
  • -N8 -j56 kết xuất 8 byte bắt đầu từ độ lệch 56 vào tệp, tương ứng với AT_PAGESZ.
  • -td8 định dạng giá trị dưới dạng số nguyên thập phân 8 byte.
  • -An chỉ hiển thị giá trị chứ không hiển thị địa chỉ.

Đọc từ một hình ảnh nhân

Bạn có thể đọc tiêu đề của hình ảnh nhân để xác định kích thước trang. Điều này rất hữu ích trong trình tải khởi động, nếu bạn cần biết loại nhân mà bạn đang khởi động.

Kích thước trang nằm ở byte thứ 25 của tiêu đề nhân:

 $ 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

Trong ví dụ này, giá trị là 0x0C = 0000 1100b. Bit 1 có giá trị 0 và bit 2 có giá trị 1. Khi đọc hai bit này, chúng ta sẽ nhận được 10b hoặc 2 ở dạng thập phân. Dựa trên giá trị của các bit này, bạn có thể xác định kích thước trang nhân:

  • 0 – Không xác định
  • 1 – 4 KB
  • 2 – 16 KB
  • 3 – 64 KB

Để biết thêm thông tin, hãy xem tài liệu về nhân Linux