释放pages的基础知识在“Buddy system基础 ”这篇文章中已经讲过了,这里主要分析释放pages的代码。
代码框架
free_pages
|----->__free_pages(virt_to_page((void *)addr), order);
| |----->__free_pages_ok(page, order);
| | |----->migratetype = get_pfnblock_migratetype(page, pfn);
| | | 获取page所属pageblock的迁移类型
| | |----->free_one_page(page_zone(page), page, pfn, order, migratetype);
| | | |----->__free_one_page(page, pfn, zone, order, migratetype);
| | | | |----->max_order = min_t(unsigned int, MAX_ORDER, pageblock_order + 1);
| | | | | 选择最大的order,当前上下文是11
| | | | |----->page_idx = pfn & ((1 << MAX_ORDER) - 1);
| | | | | 获取page在pageblock中的index
| | | | |----->buddy_idx = __find_buddy_index(page_idx, order);
| | | | | 获取其伙伴的page_index
| | | | |----->buddy = page + (buddy_idx - pag