- 论坛徽章:
- 0
|
本帖最后由 zmmkele 于 2013-07-05 16:09 编辑
linux版本: 2.4.0
在free_pages_ok()函数源码中有两个疑问:- while (mask + (1 << (MAX_ORDER-1))) {
- struct page *buddy1, *buddy2;
- if (area >= zone->free_area + MAX_ORDER)
- BUG();
- [color=Red]/* 这边改变的貌似只能是area_map的第一个int中的bit而已? */[/color]
- if (!test_and_change_bit(index, area->map))
- /*
- * the buddy page is still allocated.
- */
- break;
- /*
- * Move the buddy up one level.
- */
- buddy1 = base + (page_idx ^ -mask);
- buddy2 = base + page_idx;
- if (BAD_RANGE(zone,buddy1))
- BUG();
- if (BAD_RANGE(zone,buddy2))
- BUG();
-
- [color=Red] /* 怎么只删除了buddy1所在的list,没操作area其它页面? */[/color]
- memlist_del(&buddy1->list);
- mask <<= 1;
- area++;
- index >>= 1;
- page_idx &= mask;
- }
复制代码 刚看内存管理部分,望大家指教。
问题1: if (!test_and_change_bit(index, area->map)), 这边改变的貌似只能是area_map的第一个int中的bit而已?
问题2: memlist_del(&buddy1->list), 怎么只删除了buddy1所在的list,没操作area其它页面?
BR
|
|