基本上,我有一个程序可以找到一个进程的所有VMA,但我也希望查看页面表中该进程的页面。我被难住了。我知道进程的任务结构有一个字段

pgd_t                  *pgd;                /* page global directory */

这只是所有页面的索引数组吗?
我在“/mm/memory.c”中找到这个函数
/*
* Do a quick page-table lookup for a single page.
*/
struct page *follow_page(struct vm_area_struct *vma, unsigned long address,
                    unsigned int flags)

我可以给它一个VMA,但我不确定地址和标志应该是什么。或许这不是我想要的?有什么建议吗?

最佳答案

听起来你想做一个初步的页面浏览。
给定一个pgd,您可以遍历条目以查找有效的pud,然后遍历pud,依此类推。
一种方法是使用以下方法:

// iterate through your address space
for (i = 0; i < PAGE_SIZE / sizeof(*pud); i++) {
    pud = pud_offset(pgd, PUD_SIZE * i);
    // Check if the pud is valid
    if (pud_none(*pud) || pud_bad(*pud))
        continue;
    // And so on
}

09-04 17:51