我发现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;
}
答案 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分配器作为一个整体来管理它们。