linux-内存管理_申请释放

因为buddy之间的pfn差距肯定都是order的整数倍,所以如果此次释放的pfn的index的order的位是0那么对应的buddy对应的index对应的order位肯定是1,反之如果是1肯定对应的是0。注意__GFP_DMA、__GFP_HIGHMEM、__GFP_DMA32和__GFP_MOVABLE标志可以相互组合使用,如下的GFP_ZONEMASK宏则是提取出这四个标志位,GFP_ZONE_TABLE是合法的组合情况,GFP_ZONE_BAD是由于上述互斥引入的非法的情况。...
摘要由CSDN通过智能技术生成

alloc_pages函数实现:

#define alloc_pages(gfp_mask, order) \

                alloc_pages_node(numa_node_id(), gfp_mask, order)

 上图的nid是针对numa,此处不做引入分析,可以直接将nid当做0分析。

__alloc_pages函数是透传调用__alloc_pages_nodemask(gfp_mask, order, zonelist, NULL);

gfp_t gfp_allowed_mask __read_mostly = GFP_BOOT_MASK;

__GFP_BITS_MASK包含所有的存在含义的标志位。

#define GFP_BOOT_MASK (__GFP_BITS_MASK & ~(__GFP_WAIT|__GFP_IO|__GFP_FS))

 

 

上述代码的2809-2813行是定义一个局部变量alloc_context变量,并且初始化了优先分配的zone索引high_zonidx,nodemask=NULL,根据gfp标志算出分配的迁移类型。上述2815行是计算出合法的gfp_mask。2821行相当于是进行参数合法性检查2829-2830是进行zone的参数合法性检查。2832-2833是针对开启了CMA则指定ALLOC_CMA分配标志,其中2839-2843是决定从哪个zone分配内存,first_zones_zonelist函数会根据传入的gfp找到对应的目标zone,然后再全局的zonelist链表里搜索到索引值小于等于目标zone对应的索引值的zone。

在分析first_zones_zonelist函数之前先分析下数据结构。2850行get_page_from_freelist是真正执行分配任务的函数,详细实现参考1.2节。2851-2860是针对分配失败的情况这个后面会继续分析。2874-2875会再一次尝试。2877则是返回分配成功的page结构地址。

内存分配标志

下面标志表示对应的区域分配

#define __GFP_DMA       ((__force gfp_t)___GFP_DMA)   DMA zone分配

#define __GFP_HIGHMEM   ((__force gfp_t)___GFP_HIGHMEM)

#define __GFP_DMA32     ((__force gfp_t)___GFP_DMA32)

#define __GFP_MOVABLE   ((__force gfp_t)___GFP_MOVABLE)  /* Page is movable */

#define GFP_ZONEMASK    (__GFP_DMA|__GFP_HIGHMEM|__GFP_DMA32|__GFP_MOVABLE)

下面分配标志改变分配的行为,每个分配标志代码里都有详细的注释

#define __GFP_WAIT      ((__force gfp_t)___GFP_WAIT)    /* Can wait and reschedule? */

#define __GFP_HIGH      ((__force gfp_t)___GFP_HIGH)    /* Should access emergency pools? */

#define __GFP_IO        ((__force gfp_t)___GFP_IO)      /* Can start physical IO? */

#define __GFP_FS        ((__force gfp_t)___GFP_FS)      /* Can call down to low-level FS? */

#define __GFP_COLD      ((__force gfp_t)___GFP_COLD)    /* Cache-cold page required */

#define __GFP_NOWARN    ((__force gfp_t)___GFP_NOWARN)  /* Suppress page allocation failure warning */

#define __GFP_REPEAT    ((__force gfp_t)___GFP_REPEAT)  /* See above */

#define __GFP_NOFAIL    ((__force gfp_t)___GFP_NOFAIL)  /* See above */

#define __GFP_NORETRY   ((__forc

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值