内存管理-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)    收藏  举报

导航