内存管理-55-工具-page_types
注: 基于msm-5.4
一、简介
本文主要介绍 tools/vm/page-types.c。
1. page-types.c 的作用
chatGPT: Linux内核中 tools/vm/page-types.c 文件的作用?
Linux内核中的 tools/vm/page-types.c 是一个用户态工具,主要用于分析和展示物理内存页的状态与属性,是内核开发者和系统管理员调试内存问题、优化内存使用的重要工具。它通过解析内核在 /proc 文件系统中导出的内存元数据(如 /proc/kpageflags、/proc/kpagecount、/proc/kpagecgroup),以人类可读的形式呈现物理页的类型、计数和归属信息。
该工具的核心功能包括三类:
(1) 物理页类型统计(如区分匿名页、文件页、 HugeTLB 页等)、
(2) 页标志解析(将内核内部 page->flags 转换为 kernel-page-flags.h 中定义的符号化名称,如 PG_locked、PG_reserved)、
(3) 及内存位置追踪。例如,通过修改 page-types.c,可以获取进程虚拟地址对应的物理页帧号,进而分析内存跨 NUMA 节点的分布,这在性能调优中尤为关键——阿里云等企业曾通过此工具验证 ECS 实例与 MySQL 性能差异是否与物理内存位置相关(如跨 socket 访问延迟)。
使用时,page-types 工具通过命令行参数控制输出粒度,例如 -p <PID> 可聚焦特定进程的内存页,-a 显示所有物理页的标志位。其实现依赖内核 proc 文件系统的内存接口,因此无需直接操作内核代码即可获取底层内存状态,兼顾安全性与便捷性。需注意,该工具的输出结果与内核版本强相关,不同版本的 page->flags 定义可能存在差异,使用时需匹配目标系统的内核头文件。
问答:
A: 如何通过Linux的pagemap机制确定进程的物理内存位置?
Q: 可以通过pagemap机制将进程的虚拟地址对应到物理地址。通过修改 tools/vm/page-types.c 等工具,可以获取进程对应的所有物理地址,从而确定进程的物理内存位置。
2. 编译
参考另一篇BK https://www.cnblogs.com/hellokitty2/p/19298992 中的 《三、slabinfo 等文件编译》
3. 用法
/data/local/tmp # ./page_types_static --help page-types [options] -r|--raw Raw mode, for kernel developers -d|--describe flags Describe flags -a|--addr addr-spec Walk a range of pages -b|--bits bits-spec Walk pages with specified bits -c|--cgroup path|@inode Walk pages within memory cgroup -p|--pid pid Walk process address space -f|--file filename Walk file address space -i|--mark-idle Mark pages idle -l|--list Show page details in ranges -L|--list-each Show page details one by one -C|--list-cgroup Show cgroup inode for pages -M|--list-mapcnt Show page map count -N|--no-summary Don't show summary info -X|--hwpoison hwpoison pages -x|--unpoison unpoison pages -F|--kpageflags filename kpageflags file to parse -h|--help Show this usage message flags: 0x10 bitfield format, e.g. anon bit-name, e.g. 0x10,anon comma-separated list, e.g. addr-spec: N one page at offset N (unit: pages) N+M pages range from N to N+M-1 N,M pages range from N to M-1 N, pages range from N to end ,M pages range from 0 to M-1 bits-spec: bit1,bit2 (flags & (bit1|bit2)) != 0 bit1,bit2=bit1 (flags & (bit1|bit2)) == bit1 bit1,~bit2 (flags & (bit1|bit2)) == bit1 =bit1,bit2 flags == (bit1|bit2) bit-names: locked error referenced uptodate dirty lru active slab writeback reclaim buddy mmap anonymous swapcache swapbacked compound_head compound_tail huge unevictable hwpoison nopage ksm thp offline zero_page idle_page pgtable reserved(r) mlocked(r) mappedtodisk(r) private(r) private_2(r) owner_private(r) arch(r) uncached(r) softdirty(r) readahead(o) slob_free(o) slub_frozen(o) slub_debug(o) file(o) swap(o) mmap_exclusive(o) (r) raw mode bits (o) overloaded bits
4. 示例
(1) -r
/data/local/tmp # ./page_types_static -r flags page-count MB symbolic-flags long-symbolic-flags 0x0000000000000000 693039 2707 ___________________________________________ 0x0000000000100000 5338938 20855 ____________________n______________________ nopage 0x0000000004000000 35255 137 __________________________g________________ pgtable 0x0000000000008000 885 3 _______________H___________________________ compound_head ... 0x000000200000787c 29 0 __RUDlA____Masb_________________O__________ referenced,uptodate,dirty,lru,active,mmap,anonymous,swapcache,swapbacked,owner_private 0x000000000000587c 121 0 __RUDlA____Ma_b____________________________ referenced,uptodate,dirty,lru,active,mmap,anonymous,swapbacked total 8880384 34689
(2) -l
/data/local/tmp # ./page_types_static -l ... 16a1f8 1 ___U_l_____________________________________ 16a1f9 1 ___U_lA____Ma_b____________________________ 16a1fa 1 ___U_l_____________________________________ ...
看起来可以打印每一个页帧号对应page的标志位。
(3) -p
/data/local/tmp # ./page_types_static -p $$ flags page-count MB symbolic-flags long-symbolic-flags 0x0000000000000800 2 0 ___________M_______________________________ mmap 0x000000000004082c 489 1 __RU_l_____M______u________________________ referenced,uptodate,lru,mmap,unevictable 0x000000000004483c 57 0 __RUDl_____M__b___u________________________ referenced,uptodate,dirty,lru,mmap,swapbacked,unevictable 0x0000000000000868 24 0 ___U_lA____M_______________________________ uptodate,lru,active,mmap 0x000000000000086c 73 0 __RU_lA____M_______________________________ referenced,uptodate,lru,active,mmap 0x0000000000005868 182 0 ___U_lA____Ma_b____________________________ uptodate,lru,active,mmap,anonymous,swapbacked 0x000000000000586c 1 0 __RU_lA____Ma_b____________________________ referenced,uptodate,lru,active,mmap,anonymous,swapbacked total 828 3
二、实现
TODO
posted on 2025-12-02 20:22 Hello-World3 阅读(0) 评论(0) 收藏 举报
浙公网安备 33010602011771号