Что означает, что /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
и выделено, это означает:
- Используется в плитах.
page->page_type < PAGE_MAPCOUNT_RESERVE
см. patch: верните 0 для специальных страниц, которые никогда не отображаются. Этот патч довольно новый. Подумайте, когда задают этот вопрос, я не думаю, что это так.page_mapcount(page)
возвращает ноль. некоторые страницы выделены, но не отображаются. Я не уверен почему. В любом случае, вы можете написать модуль / код ядра, который выделяет страницу без создания отображения.