- 论坛徽章:
- 0
|
本帖最后由 baozhao 于 2010-04-22 14:13 编辑
伙伴算法初始化的后,free_area数组每个元素里的free_list是不是空的?
要看你怎么理解初始化了. 实际上,伙伴系统的初始化是一个过程, 伙伴系统初始化可以看成是由 bootmem allocator完成, 与伙伴系统相关的主要有两步
以2.6.11代码为例:
1 bootmem的早期, 在初始化zone的过程共会调用free_area_init_core, 该函数调用 zone_init_free_lists.
可以看到,free_area数组每个元素里的free_list的确是空的.- void zone_init_free_lists(struct pglist_data *pgdat, struct zone *zone,
- unsigned long size)
- {
- int order;
- for (order = 0; order < MAX_ORDER ; order++) {
- INIT_LIST_HEAD(&zone->free_area[order].free_list);
- zone->free_area[order].nr_free = 0;
- }
- }
复制代码 2. 在bootmem的后期, 会把初始化后未用到的页面全部释放给buddy.
在mem_init()函数中有如下代码, 注意最初的注释以及__free_all_bootmem和set_highmem_pages_init函数,这两个函数都将调用__free_pages或__free_page函数将空闲页面加入相关的freelist- /* this will put all low memory onto the freelists */
- totalram_pages += __free_all_bootmem();
- reservedpages = 0;
- for (tmp = 0; tmp < max_low_pfn; tmp++)
- /*
- * Only count reserved RAM pages
- */
- if (page_is_ram(tmp) && PageReserved(pfn_to_page(tmp)))
- reservedpages++;
- set_highmem_pages_init(bad_ppro);
复制代码 |
|