linux之memblock分配器

1、memblock初始化
1.1、memblock_x86_fill
在这里插入图片描述
1146行,设置memblock_can_resize标识
1164行,吧e820里面的加入到memblock分配器里面
1164行,吧每一部分都按照page来处理的

2、memblock分配内存
2.1、memblock_find_in_range
在这里插入图片描述
292行找到flags的标识,这里先配置最简单的node了
在这里插入图片描述
228行如果end设置为0,那么就把end设置成current最大值了
232行,这里设置start与page_size的最大值,这里是不用第一个页面进行分配
233行,找到start与end的最大值了
234行,找到内核end的物理地址放入kernel_end里面
在这里插入图片描述
271行,执行memblock的分配函数了

2.2、__memblock_find_range_top_down

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1127行找到idx的低32位赋值给idx_a
1128行找到index的高32位赋值给idx_b
1136-1138行,如果是最开始的值,那么就设置idx_a等于cnt减1
Idx_b等于typeb的cnt了
1141-1146行,找到type_a的m_start与size地址
在这里插入图片描述
1169行-1183行如果type_b为空那么直接就设置type_a拿到的值为真正的值了
在这里插入图片描述
1186行如果type_b存在
1191行,找到idx_b的地址
1194行,如果idx_b等于0那么r_start等于0,如果不等于0,那么就等于前一个的地址,加上对应的size,也就是前一个的end地址
1195行,r_end等于如果idx_b小于type_b的cnt那么r_end等于r_base了,要么就等于最大值
这一部分主要的含义是找到在reserve里面上个idx与这个idx的空闲内存,这个空闲内属于上一个idx的end,与这个index的start,这里面有特别情况,也就是第一个idx与最后一个idx,第一个idx表示那么最开始的start等于0,到第一个开始的start,最后一个空闲内存等于最大值了,这里就找到在reserve里面空闲的内存了
在这里插入图片描述
如果m_end大于r_start的话,那么在原来type_a里面找与type_b空闲内存重叠的内存
这样然后在看那个start比较大,就把对应的减少了
3、memblock_reserve

在这里插入图片描述
memblock_free(补充)

memblock_set_node(补充)

6、memblock_mem_size

在这里插入图片描述
614行,遍历memory里面的item了
615行,找到start_pfn的页面
616行,找到end_pfn的页面
617-618行,判断这个是否是小于limint_pfn页面
619行,page等于找到的页面数
622行,吧找到的页面数变成具体的大小了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值