基本上,我有一个程序可以找到一个进程的所有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
}