x86中没有boot memory allocator,是用 memblock 来分配的。
memblock有memory 与reserved两种类型,它们的内存是静态内存,不需要用memblock本身去维护,它们被标记为__initdata_memblock,会在boot结束后(free_initmem)调free_reserved_page释放掉。
memblock.memory指的是所有可用的物理内存,是从bios读上来的各可用内存区(e820__memblock_setup)
所有在boot时期动态分配的内存都是记在memblock.reserved上的,它是从memblock.memory上切割下来的部分,释放时也是还到memblock.reserved上,可用于存如initrd、dtb中的设备保留内存、kernal 代码等。
在转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完全相同,不同用途的内存区域不可以合并。