gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:31 27 4
gpt4 key购买 nike

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

我遇到的问题如下:

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

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

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

}

遍历物理页面

您需要为 ptepmd 设置 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,
};

设置回调后。

关于c - 如何使用内核模块计算 Linux 中进程的匿名页面和共享页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48389199/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com