unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order)
功能:以gfp_mask的方式分配2^order个物理页面
gfP_mask:分配的方式,指出如何分配在哪分配如GFP_KERNEL
order:分配2^order个页面
返回值:返回分配的第一个页的逻辑地址
头文件: #include <gfp/linux.h>
unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order)
{
struct page *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);
}
unsigned long get_zeroed_page(gfp_t gfp_mask)
功能:获得物理页地址返回的是虚拟地址类似于__get_free_pages但此函数会将页数据清零
gfp_mask:分配方式 GFP_KERNEL GFP_ATOMIC
内核代码:
unsigned long get_zeroed_page(gfp_t gfp_mask)
{
return __get_free_pages(gfp_mask | __GFP_ZERO, 0);
}
头文件:#include <linux/gfp.h>
此函数申请的空间用free_pages()来释放
void free_pages(unsigned long addr, unsigned int order)->将调用__free_pages()
功能:释放逻辑地址addr开始的页面2^order次方个
addr:页面开始的逻辑地址
order:释放页面的个数2^order个
头文件: #include <linux/gfp.h>
void free_pages(unsigned long addr, unsigned int order)
{
if (addr != 0) {
VM_BUG_ON(!virt_addr_valid((void *)addr));
__free_pages(virt_to_page((void *)addr), order);
}
}
例子如下

本文介绍了Linux内核中的__get_free_pages函数,用于按需分配物理页面,并详细解析了其参数和工作原理。同时提到了get_zeroed_page函数,它会在分配页面的同时清零数据。最后,阐述了free_pages函数的使用,用于释放之前分配的内存页面。这些函数在内核内存管理中扮演着关键角色。

3096

被折叠的 条评论
为什么被折叠?



