【问题标题】:How to count the anonymous pages and shared pages for a process in Linux using kernel module如何使用内核模块计算Linux中进程的匿名页面和共享页面
【发布时间】:2018-07-01 12:48:43
【问题描述】:

我正在尝试查找在 Linux os (ubuntu 14.04) 上运行的 c 程序的驻留集大小。我得到正在运行的 C 程序的 PID 并将其传递给自定义内核模块。内核模块找出*task 并提取*mm 指针。然后我循环遍历所有VM areas 并在每个VM area 中再次循环遍历对齐virtual addresses 的每个页面并请求page_walk(virtual addresses) 以获得pte 类型的pte_t 结构。然后我使用pte_preset()函数来检查内存中实际物理页的存在。

我面临的问题如下:

rss 值与htop 或top 中显示的值不匹配。虽然我计算的值确实会随着测试 C 程序访问更多内存(使用一些数组访问)而按比例增加。

我发现htop 应用程序的rss 值给出的结果与Linux 内核本身提供的get_mm_struct() 函数调用给出的结果相同。

static inline unsigned long get_mm_rss(struct mm_struct *mm)
{
    return get_mm_counter(mm, MM_FILEPAGES) +
        get_mm_counter(mm, MM_ANONPAGES) +
        get_mm_counter(mm, MM_SHMEMPAGES);
}

我的问题是如何统计或检测这些匿名页面和共享页面?需要检查哪些位?

谢谢!

【问题讨论】:

    标签: c linux memory-management linux-kernel


    【解决方案1】:

    做到这一点的正确方法是意识到计数在一个数组中。试试:

    static inline unsigned long get_mm_rss(struct mm_struct *mm) 
    {
        int k;
        unsigned long count = 0;
        for(k = 0; k < NR_MM_COUNTERS; k++) {
             long len = atomic_long_read(&mm->rss_stat.count[k]);
             if(len < 0)  
                  len = 0;         
             count += len;
        }
    
    }
    

    步行物理页面

    您需要使用 pte 和 pmd 的回调设置 mm_walk 结构(由内核中是否使用 HUGETABLES 驱动)来遍历物理页面。

    例如:

    show_smap 使用这个:

        struct mm_walk smaps_walk = {
            .pmd_entry = smaps_pte_range,
    #ifdef CONFIG_HUGETLB_PAGE
            .hugetlb_entry = smaps_hugetlb_range,
    #endif
            .mm = vma->vm_mm,
        };
    

    在设置回调之后。

    【讨论】:

    • 谢谢!但我正在寻找一个不应该使用atomic_long_read 或get_mm_rss 函数的解决方案。我需要以某种方式使用page_walk 来实现目标(即计算总物理页数)
    • 啊啊!我明白了,你应该可以修改它来做一个 page_walk
    • 您能再解释一下吗?我不明白你的程序
    猜你喜欢
    • 2015-07-18
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 2016-10-19
    • 2012-11-04
    • 2020-12-29
    相关资源
    最近更新 更多