zoukankan      html  css  js  c++  java
  • 内存管理小结(2)--伙伴系统API

    伙伴系统分配内存以2的整数幂次的页数为单位。提供的API主要分为分配类与释放类。

    1.分配类

     1.1unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order)

    #define __get_free_page(gfp_mask) 
            __get_free_pages((gfp_mask),0)

    返回分配的内存的虚拟地址。

     1.2unsigned long get_zeroed_page(gfp_t gfp_mask)

    不能在高端域分配内存。返回分配的内存的虚拟地址,分配的内存用0初始化。

    1.3static inline struct page * alloc_pages(gfp_t gfp_mask, unsigned int order)

    返回struct * page指针。

     

    从以上伙伴系统分配内存的API看,最终调用的是alloc_pages函数。

    alloc_pages(gfp_mask, order)
        -->alloc_pages_node(numa_node_id(), gfp_mask, order)
            -->__alloc_pages(gfp_mask, order, node_zonelist(nid, gfp_mask));
                -->__alloc_pages_internal(gfp_mask, order, zonelist, NULL);

    这个函数经过一系列的函数调用,最终会在伙伴系统中分配出申请的数量的内存。

    __alloc_page_internal函数的注释为This is the 'heart' of the zoned buddy allocator,其内部又是一堆复杂的函数调用。这里暂且不去分析了。

    2.释放类API

    2.1void free_pages(unsigned long addr, unsigned int order)

    参数为虚拟地址。

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

    2.2void __free_pages(struct page *page, unsigned int order)

  • 相关阅读:
    二叉排序树
    堆排序
    线索化二叉树
    vue 格式化代码
    线程的理解
    声明式的服务调用 Feign
    使用锁 的理解
    zookeeper 的理解
    AQS 源码解析
    HashMap 的理解与结构
  • 原文地址:https://www.cnblogs.com/yangjiguang/p/9539033.html
Copyright © 2011-2022 走看看