alloc_pages()是否分配2MB大页面?

时间:2011-11-22 17:05:15

标签: c memory-management linux-kernel

我发现alloc_presh()被alloc_fresh_huge_page_node()调用来分配一个巨大的页面,只是想确认它是否分配了一个物理大页面并且还构建了内存映射?

static struct page *alloc_fresh_huge_page_node(struct hstate *h, int nid)
{
    struct page *page;

    if (h->order >= MAX_ORDER)
        return NULL;

    page = alloc_pages_exact_node(nid,
        htlb_alloc_mask|__GFP_COMP|__GFP_THISNODE|
                        __GFP_REPEAT|__GFP_NOWARN,
            huge_page_order(h));
    if (page) {
        if (arch_prepare_hugepage(page)) {
            __free_pages(page, huge_page_order(h));
            return NULL;
        }
        prep_new_huge_page(h, page, nid);
    }

    return page;
}

2 个答案:

答案 0 :(得分:1)

Alloc_pages()分配您使用它的任何可能的页面大小。 2MB是一个选项(通常在使用PAE时),其他选项在2.6内核上,4kb和4MB。

答案 1 :(得分:1)

嗯,不,alloc_pages()只能在启用PAE时为您提供大页面,这意味着大页面对调用者是透明的。但是对于你的情况,使用hugetlb,alloc_pages()不能这样做,alloc_fresh_huge_page_node()调用alloc_pages()来分配一些连续的页面并由hugetlb分配器作为一个整体来管理它们。