Trang này liệt kê các cách để lấy kích thước trang nhân hệ điều hành được dùng trên thiết bị. Để kết nối với thiết bị, bạn có thể sử 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ư sau:
$ getconf PAGE_SIZE
4096
Sử dụng tệp giả /proc//smaps
Trường KernelPageSize
trong tệp giả lập /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ụ trợ 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ả lập /proc/config.gz
Kiểm tra cấu hình hạt nhân cho kích thước trang trong tệp giả lập /proc/config.gz
. Sau đây là các cấu hình có thể có cho kích thước trang:
CONFIG_ARM64_4K_PAGES=y
: hạt nhân sử dụng các trang 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, hạt nhân sẽ phân bổ và khởi chạy vectơ phụ trợ bằng thông tin, chẳng hạn như kích thước trang mà 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ụ trợ của quy trình 1 có thể được thể hiện 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ừ độ dời 56 vào tệp, tương ứng vớiAT_PAGESZ
.-td8
định dạng giá trị dưới dạng số nguyên 8 byte thập phân.-An
chỉ hiển thị giá trị chứ không hiển thị địa chỉ.
Đọc từ hình ảnh nhân
Bạn có thể đọc tiêu đề của hình ảnh hạt 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 đ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
theo hệ 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 hạt nhân:
0
– Không xác định1
– 4 KB2
– 16 KB3
– 64 KB
Để biết thêm thông tin, hãy xem Tài liệu về nhân hệ điều hành Linux