linux boot阶段内存分配(x86)

x86中没有boot memory allocator,是用 memblock 来分配的。
memblock有memory 与reserved两种类型,它们的内存是静态内存,不需要用memblock本身去维护。
memblock.memory指的是所有可用的内存,在init_numa或为driver分配内存时,将分配的区间绑定到memblock.memory上,后面就可以去这个区瓜分对应类型的内存。所有在boot时期动态分配的内存都是从memblock.reserved上分配的,释放时也是还到memblock.reserved上。
在转buddy分配器时(start_kernel->mm_core_init->mem_init->memblock_free_all)会将所有memblock.memory中没有使用的内存切下来放到reserved内存中,然后将所有reserved的内存切分到buddy中。
切分过程是以最高阶向低阶切的,优先切满足高阶的部分。
在boot内存分配时,会去reserved列表中找一个大小合适的region(第一匹配),从后向前切出一个新region,如果没有region满足,则会将最后一个reserve的region变长。
在boot内存内存归还时,不是只要有连续内存就能合并,合并是以页为单位的,且必须两段内存的flag完全相同,不同用途的内存区域不可以合并

你可能感兴趣的:(linux)