C 如何使用内核模块计算Linux中进程的匿名页面和共享页面
我试图找到运行在Linux操作系统(ubuntu 14.04)上的c程序的常驻集大小。我得到运行C程序的PID,并将其传递给自定义内核模块。内核模块计算出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程序访问更多内存(使
*任务
,并提取*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,
};