基本上我有一个程序可以找到进程的所有 VMA,但我也想查看该进程的页表中的页。我很难过。我知道进程的 task_struct 有一个字段
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
}
关于c - 在内存中查找进程页面(linux-kernel),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20025183/