Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用内核模块计算Linux中进程的匿名页面和共享页面_C_Linux_Memory Management_Linux Kernel - Fatal编程技术网

C 如何使用内核模块计算Linux中进程的匿名页面和共享页面

C 如何使用内核模块计算Linux中进程的匿名页面和共享页面,c,linux,memory-management,linux-kernel,C,Linux,Memory Management,Linux Kernel,我试图找到运行在Linux操作系统(ubuntu 14.04)上的c程序的常驻集大小。我得到运行C程序的PID,并将其传递给自定义内核模块。内核模块计算出*任务,并提取*mm指针。然后我循环遍历所有VM区域,在每个VM区域中,我再次循环遍历每个对齐的虚拟地址页面,并请求页面漫游(虚拟地址)以获得pte\t类型的结构。然后我使用pte_preset()函数检查RAM中是否存在实际的物理页面 我面临的问题如下: rss值与htop或top中显示的值不匹配。尽管我计算的值随着测试C程序访问更多内存(使

我试图找到运行在Linux操作系统(ubuntu 14.04)上的c程序的常驻集大小。我得到运行C程序的PID,并将其传递给自定义内核模块。内核模块计算出
*任务
,并提取
*mm
指针。然后我循环遍历所有
VM区域
,在每个
VM区域
中,我再次循环遍历每个对齐的
虚拟地址
页面,并请求
页面漫游(虚拟地址)
以获得
pte\t
类型的结构。然后我使用
pte_preset()
函数检查RAM中是否存在实际的物理页面

我面临的问题如下:

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

我发现
htop
应用程序的
rss
值给出了与Linux内核本身提供的
get\u mm\u 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);
}
我的问题是如何计算或检测这些匿名页面和共享页面?需要检查哪些位


谢谢大家!

正确的方法是认识到计数在一个数组中。尝试:

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;
    }

}

设置回拨后

谢谢!但是我正在寻找一种解决方案,它不应该使用
atomic_long_read
get_mm_rss
功能。我需要以某种方式使用
page\u walk
来实现目标(即计算总物理页面)啊!我明白了,你应该可以修改它来做一次页面漫游,你能再解释一下吗?我不明白你的程序
    struct mm_walk smaps_walk = {
        .pmd_entry = smaps_pte_range,
#ifdef CONFIG_HUGETLB_PAGE
        .hugetlb_entry = smaps_hugetlb_range,
#endif
        .mm = vma->vm_mm,
    };