请教大家一个do_anonymous_page的问题

<understanding linux kernel> Page 387里有这么一段代码


if (write_access) {
    pte_unmap(page_table);
    spin_unlock(&mm->page_table_lock);
    page = alloc_page(GFP_HIGHUSER | _ _GFP_ZERO);
    spin_lock(&mm->page_table_lock);
    page_table = pte_offset_map(pmd, addr);
    mm->rss++;
    entry = maybe_mkwrite(pte_mkdirty(mk_pte(page,
                    vma->vm_page_prot)), vma);
    lru_cache_add_active(page);
    SetPageReferenced(page);
    set_pte(page_table, entry);
    /*这里为什么要unmap*/
    pte_unmap(page_table);
    spin_unlock(&mm->page_table_lock);
    return VM_FAULT_MINOR;
}


一段代码中, 给addr分配一个页表条目, 分配一个页帧, 然后填入这个页表条目(page_tagle)中.
但最后pte_unmap(page_table). 这个是什么意思?
按照字面的意思好像是删除页表条目(page_table)的映射, 那不是白分配页帧了吗?
实在理解不了,向大家请教一下. 先谢谢大家了!

作者: ninesunqian   发布时间: 2008-08-25

代码错了,你看源代码应该就能看出来,如果是HIGHPTE,那么需要unmap

作者: flw2   发布时间: 2008-08-26

昨天看了一下第二章。
发现我把pte_unmap()的参数搞错了。pte_unmap(page_table)是unmap一个线性地址,而不是一个页表条目。
即:使线性地址page_table, 不再指向内存中的某个单元。
同时感谢版主的解答!

作者: ninesunqian   发布时间: 2008-08-27

刚看到这,很疑惑,学习了~!

作者: amarant   发布时间: 2011-01-18

  1. #define pte_unmap(pte) kunmap_atomic(pte, KM_PTE0)
复制代码
  1. void kunmap_atomic(void *kvaddr, enum km_type type)
  2. {
  3. #ifdef CONFIG_DEBUG_HIGHMEM
  4.         unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
  5.         enum fixed_addresses idx = type + KM_TYPE_NR*smp_processor_id();

  6.         if (vaddr < FIXADDR_START) { // FIXME
  7.                 dec_preempt_count();
  8.                 preempt_check_resched();
  9.                 return;
  10.         }      

  11.         if (vaddr != __fix_to_virt(FIX_KMAP_BEGIN+idx))
  12.                 BUG();

  13.         /*
  14.          * force other mappings to Oops if they'll try to access
  15.          * this pte without first remap it
  16.          */
  17.         pte_clear(kmap_pte-idx);
  18.         __flush_tlb_one(vaddr);
  19. #endif

  20.         dec_preempt_count();
  21.         preempt_check_resched();
  22. }
复制代码
应该是只执行释放临时内核映射,为什么这样,还是不明白..

作者: amarant   发布时间: 2011-01-18