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行,吧找到的页面数变成具体的大小了