/proc/kpagecount 为零意味着什么

/proc/kpagecount 为零意味着什么

对于 /proc/kpagecount 中的某些条目,所有 64 位条目均为零,但页面已分配(从 /proc/kpageflags 确认)。对于某些物理页面,kpagecount 为零意味着什么?这是否意味着守护进程正在使用此内存?

答案1

proc/kpagecount是一个虚拟文件,读取后会得到执行函数的结果kpagecound_read()

static ssize_t kpagecount_read(struct file *file, char __user *buf,
                 size_t count, loff_t *ppos)
{
// ....
    u64 pcount;

    pfn = src / KPMSIZE;
    count = min_t(size_t, count, (max_pfn * KPMSIZE) - src);
    if (src & KPMMASK || count & KPMMASK)
        return -EINVAL;

    while (count > 0) {
        if (pfn_valid(pfn))
            ppage = pfn_to_page(pfn);
        else
            ppage = NULL;
        if (!ppage || PageSlab(ppage) || page_has_type(ppage))
            pcount = 0;
        else
            pcount = page_mapcount(ppage);

        if (put_user(pcount, out)) {
            ret = -EFAULT;
            break;
        }

        pfn++;
        out++;
        count -= KPMSIZE;

        cond_resched();
    }
// ...
}

并且page_has_type()是。

static inline int page_has_type(struct page *page)
{
    return (int)page->page_type < PAGE_MAPCOUNT_RESERVE;
}

如果某个页面的条目为零kpagecount且已分配,则意味着:

  1. 它用于板坯中。
  2. page->page_type < PAGE_MAPCOUNT_RESERVEpatch :对于从未映射的特殊页面,返回 0。这个补丁相当新。考虑一下当有人问这个问题时,我认为不是这样的。
  3. page_mapcount(page)返回零。有些页面已分配但未映射。我不确定为什么。无论如何,您可以编写分配页面而不创建映射的内核模块/代码。

相关内容