buddy allocator是怎样开始工作的?
时间:2010-12-18 来源:letmego163
1.
Linux启动阶段用的分配器是 boot allocator, 在start_kernel()中调用mm_init(), 然后把boot allocator管理的物理内存 交给buddy allocator, 以__free_pages()的方式把pages放到buddy的数据结构free_areas中。
mm_init() > mem_init() > free_all_bootmem() > free_all_bootmem_core() > __free_pages()
2.
boot allocator, kernel首先调用initmem_init()把管理的所有页都标记为已经分配,然后再选择空闲的页标记为0,表示可以分配。然后,调用
void __init initmem_init(unsigned long start_pfn, unsigned long end_pfn, |
然后,调用early_res_to_bootmem(), dma32_reserve_bootmem() 保留一部分页,不能交给boot allocator分配。为什么要这样做呢?前面free的页包括内核代码和数据占用的页,如果这些页也拿给boot
allocator的话,系统可能会崩溃,所以,要把这些页标记为保留。 x86_64_start_reservations()中调用reserve_early(__pa_symbol(&_text), __pa_symbol(&__bss_stop), "TEXT DATA BSS"), 通过这种方式把要保留的地址段记录在early_res[]数组中,而early_res_to_bootmem()则根据early_res[]数组中记录的要保留的地址信息进行保留页操作。
void __init early_res_to_bootmem(u64 start, u64 end) |