已经在没看函数定义前觉得有点奇怪,它怎么是用page_address, 现在知道了,如果分配的页面里面有 __GFP_HIGHMEM 的标志,直接就BUG_ON 了。
这说明__get_free_pages是从低端内存分配的, 释放函数用free_page(addr), 而不用 __free_page(page).
{
struct page *page;
/*
* __get_free_pages() returns a 32-bit address, which cannot represent
* a highmem page
*/
VM_BUG_ON((gfp_mask & __GFP_HIGHMEM) != 0);
page = alloc_pages(gfp_mask, order);
if (!page)
return 0;
return (unsigned long) page_address(page);
}
EXPORT_SYMBOL(__get_free_pages);