内核函数__get_free_page和 free_pages

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);
    }
}

例子如下

猜你喜欢

转载自blog.csdn.net/yldfree/article/details/81140022