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