我检查了任务的vm_area_struct区域并尝试获取相应的结构页面*(页面),但有些页面在RAM中不存在:pte_present(* pte)返回0 。我无法理解这种行为,因为我没有交换区域,所以我想所有的用户空间虚拟空间都会映射到RAM中显示的页面。有人能解释我吗?为什么我在交换关闭时没有pid页面
static struct page * get_page(unsigned long addr)
{
pgd_t *pgd;
pte_t *pte;
pud_t *pud;
pmd_t *pmd;
struct page *pg;
struct mm_struct *mm = current->mm;
pgd = pgd_offset(mm, addr);
if (pgd_none_or_clear_bad(pgd)) {
goto err;
}
pud = pud_offset(pgd, addr);
if (pud_none(*pud) || pud_bad(*pud)) {
goto err;
}
pmd = pmd_offset(pud, addr);
if (pmd_none(*pmd) || pmd_bad(*pmd)) {
goto err;
}
pte = pte_offset_map(pmd, addr);
if (!pte) {
goto err;
}
if (!pte_present(*pte)) {
PR("pte is not present\n");
goto err;
}
pg = pte_page(*pte);
if (!pg) {
pte_unmap(pte);
goto err;
}
pte_unmap(pte);
你可以发布你检查的代码吗? – sashoalm