为什么我在交换关闭时pte不显示页面

时间:2015-05-14 07:19:16

标签: linux-kernel

我查看任务的vm_area_struct区域并尝试获取相应的struct page *(pages),但RAM中不存在某些页面:pte_present(* pte)返回0.我无法理解这种行为,因为我没有交换区域,所以我认为所有用户空间虚拟空间都映射到RAM中的显示页面。有人可以解释一下吗?

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);

2 个答案:

答案 0 :(得分:0)

pte_none检查pte中没有值,pte_present检查存在标志。

cache: false, // we do not need any browser posibble caches here..
success: callback, 
// remove this line: jsonpCallback: 'jsonCallback', 

因此换出页面的条件为#define pte_none(pte) (!pte_val(pte)) #define pte_present(pte) (pte_isset((pte), L_PTE_PRESENT))

在你的情况下,你将所有空的ptes解释为交换出来......

答案 1 :(得分:0)

可能是一个小页错误,其中保留了内存区域,但尚未分配数据。