- 论坛徽章:
- 0
|
static struct page * rmqueue(zone_t *zone, unsigned long order)
{
free_area_t * area = zone->free_area + order;//根据order值找到需申请的free_area。问题一,如order
unsigned long curr_order = order; //为2,那么挂入free_area_t中的相邻的page数据结构是否间隔
struct list_head *head, *curr; //为1,比如该free_area中的头一个page的序列号为10,第二个
unsigned long flags; //为12,以此类推,如果order值为3则间隔为8,是否是这样挂进
struct page *page; //的呢 ?
spin_lock_irqsave(&zone->lock, flags);
do {
head = &area->free_list;
curr = memlist_next(head);//
if (curr != head) {
unsigned int index;
page = memlist_entry(curr, struct page, list);
if (BAD_RANGE(zone,page))
BUG();
memlist_del(curr);
index = (page - mem_map) - zone->offset;
MARK_USED(index, curr_order, area);//问题二 谁能解释一下,这个位图应该怎么理解?
zone->free_pages -= 1 << order;
page = expand(zone, page, index, order, curr_order, area);
spin_unlock_irqrestore(&zone->lock, flags);
set_page_count(page, 1);
if (BAD_RANGE(zone,page))
BUG();
DEBUG_ADD_PAGE
return page;
}
curr_order++;
area++;
} while (curr_order < MAX_ORDER);
spin_unlock_irqrestore(&zone->lock, flags);
return NULL;
} |
|