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