/*释放到指定的伙伴系统类型链表*/
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));
/* 校验页块是否有效,检查是否有空洞,页块中的页面是否都在同一个zone中 */
VM_BUG_ON(bad_range(zone, page));
//用来一对伙伴是否能合并
while (order < MAX_ORDER-1)
{
unsigned long combined_idx;
struct page *buddy;
/* 找出page页面的伙伴
查找待释放页块的伙伴 ,其中伙伴系统中每个块
都有一个对应同样大小的"伙伴块"(由2的指数原理知)
*/
buddy = __page_find_buddy(page,
释放页__free_one_page()
最新推荐文章于 2022-04-14 08:10:44 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)