2015-05-14 41 views
3

我检查了任务的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); 
+0

你可以发布你检查的代码吗? – sashoalm

回答

0

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

#define pte_none(pte)   (!pte_val(pte)) 
#define pte_present(pte)  (pte_isset((pte), L_PTE_PRESENT)) 

所以换出的页面的情况会!pte_present && !pte_none

而在你的情况,你解释所有空的PETS作为交换出去......

0

这可能是一个小页面错误所在的内存区域被保留,但尚未分配数据。

相关问题