- 论坛徽章:
- 1
|
释放页到伙伴系统的最底层函数__free_one_page 中有一个不理解的地方:
函数
- static inline void __free_one_page(struct page *page,
- struct zone *zone, unsigned int order,
- int migratetype)
- {
- unsigned long page_idx;
- if (unlikely(PageCompound(page)))
- if (unlikely(destroy_compound_page(page, order)))
- return;
- VM_BUG_ON(migratetype == -1);
- page_idx = page_to_pfn(page) & ((1 << MAX_ORDER) - 1);
- VM_BUG_ON(page_idx & ((1 << order) - 1));
- VM_BUG_ON(bad_range(zone, page));
- while (order < MAX_ORDER-1) {
- unsigned long combined_idx;
- struct page *buddy;
- buddy = __page_find_buddy(page, page_idx, order);
- if (!page_is_buddy(page, buddy, order))
- break;
- /* Our buddy is free, merge with it and move up one order. */
- list_del(&buddy->lru);
- zone->free_area[order].nr_free--;
- rmv_page_order(buddy);
- combined_idx = __find_combined_index(page_idx, order);
- page = page + (combined_idx - page_idx);
- page_idx = combined_idx;
- order++;
- }
- set_page_order(page, order);
- list_add(&page->lru,
- &zone->free_area[order].free_list[migratetype]);
- zone->free_area[order].nr_free++;
- }
复制代码
page_idx = page_to_pfn(page) & ((1 << MAX_ORDER) - 1); 这个 page_idx 到底是什么?
page_to_pfn:pfn = 0 page相当于mem_map[0],pfn = 1 ,page相当于mem_map[1],即page_to_pfn获得的是page的页帧号,这个没理解错吧?
pfn & ((1 << MAX_ORDER) - 1)这个获取的到底是什么?还有那个combined_idx我也不知道是什么?求解。
|
|