为什么do_anonymous_page()在设置新的pte条目后调用pte_unmap()?(linux kerenl 2.6.11内存管理)

问题描述 投票:-1回答:1

我是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;
}

memory-management linux-kernel
1个回答
1
投票

如果您在第一时间阅读了page_table的填充方式,您将首先看到它是pte_offset_map-ed。有一个匹配的pte_unmap应该不足为奇。

page_table thingy不是这里设置的pte thingy。

相反,在某些体系结构上,内核具有非常有限的地址空间。例如,i386能够处理4GB的内存。这通常分为用户空间3GB和内核1GB。但是所有内核内存通常都不适合1GB。因此,根据需要,通过在可能的情况下临时映射和取消映射各种页面来解决该问题。可以看出,用户空间进程的页表受此行为的影响。这些宏不会映射/取消映射amd64上的任何内容,它具有足够大的地址空间,可以让内核永久映射所有物理内存。

热门问题
推荐问题
最新问题