第二阶段建立的是 memblock
ATAG_MEM
或
ATAG_CMDLINE mem=size@start
memblock 的管理范围 是 u-boot 决定的
u-boot 可以在这个过程中 预留内存
从 start_kernel->setup_arch->paging_init->bootmem_init->memblock_allow_resize 返回
到 kernel_init(进程1) -> free_initmem
其实从 mem_init返回 -> free_initmem ,memblock 其实只是能用而已
在这个阶段,已经存在一个buddy了, memblock 如果也使用的话,就会造成内存管理的混乱(两个内存管理器管理了大约相同的内存)
memblock 相关的函数 都是 用 __init 修饰的,
在 free_initmem 的时候会被释放掉
所以就再也不能用 memblock_alloc 来申请内存了.
实际上 mm_init 函数执行之前 , 就没有使用过 memblock_alloc 了
memblock 的使用方法
alloc方法 是 memblock_alloc
memblock_alloc
memblock_alloc_try_nid
memblock_alloc_internal
phys_addr_t alloc = memblock_alloc_range_nid
phys_addr_t found = memblock_find_in_range_node
__memblock_find_range_bottom_up
for_each_free_mem_range round_up
memblock_reserve(found, size);
return found;
return phys_to_virt(alloc);
free方法 是 memblock_free
memblock_free
memblock_remove_range(&memblock.reserved, base, size);
memblock_isolate_range(type, base, size, &start_rgn, &end_rgn);
memblock_remove_region(type, i);
其他
memblock_reserve
memblock_add_range(&memblock.reserved, base, size, MAX_NUMNODES, 0);
type->regions[0].base = base;
type->regions[0].size = size;
type->regions[0].flags = flags;
第一次循环 :
memblock_double_array
insert = true;
第二次循环 :
if (base < end) if (insert) memblock_insert_region(type, idx, base, end - base, nid, flags)
memblock_merge_regions(type);