在内核启动到mem_init()函数执行的这段时间里,Buddy系统没有初始化。在这个阶段,内核可以直接访问的数据空间包括内核的data段、bss段、sdata段中的数据。但是在内核初始化时,难免会使用到动态内存,那么此时,在不存在Buddy系统的情况下,内核便使用Boot Memory分配器管理物理内存。
Boot Memory分配器使用FFB(First Fit Allocator)算法管理空闲空间。FFB算法使用位图描述整个物理内存空间。位图中的位表示一个物理页面。如果某位为1,表示相应的物理页面已被使用。
使用FFB分配内存时,容易造成过多的外部碎片。另外需要注意的是,绝大多数在系统初始化中使用的BootMemory将不会被释放。
start_kernel()执行到一定阶段后,会调用mem_init()初始化Buddy系统。mem_init()进一步调用free_all_bootmem()将Boot Memory中的空闲页面释放到Buddy系统中。