我是linux内核的新手。今天我在do_anonymous_pages()中有一些关于linux kerenl 2.6.11内存管理代码(plz检查我的代码注释我的问题)的问题,代码片如下:
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); /* here just set new pte entry */
pte_unmap(page_table); /* why unmap just we set new maped PTE?? */
spin_unlock(&mm->page_table_lock);
return VM_FAULT_MINOR;
}
如果您在第一时间阅读了page_table的填充方式,您将首先看到它是pte_offset_map-ed。有一个匹配的pte_unmap应该不足为奇。
page_table thingy不是这里设置的pte thingy。
相反,在某些体系结构上,内核具有非常有限的地址空间。例如,i386能够处理4GB的内存。这通常分为用户空间3GB和内核1GB。但是所有内核内存通常都不适合1GB。因此,根据需要,通过在可能的情况下临时映射和取消映射各种页面来解决该问题。可以看出,用户空间进程的页表受此行为的影响。这些宏不会映射/取消映射amd64上的任何内容,它具有足够大的地址空间,可以让内核永久映射所有物理内存。