- 论坛徽章:
- 0
|
static struct page * rmqueue(zone_t *zone, unsigned long order)
{
free_area_t * area = zone->free_area + order;
unsigned long curr_order = order;
struct list_head *head, *curr;
unsigned long flags;
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;
}
#define MARK_USED(index, order, area) \
change_bit((index) >> (1+(order)), (area)->map)
static __inline__ void change_bit(int nr, volatile void * addr)
{
__asm__ __volatile__( LOCK_PREFIX
"btcl %1,%0"
:"=m" (ADDR)
:"Ir" (nr));
}
typedef struct free_area_struct {
struct list_head free_list;
unsigned int *map;
} free_area_t;
总内存为4M的系统.总共有4M/4K = 1024个页
那对应的.
2^0位图有1024/1/2 512项
2^1位图有1024/2/2= 256项
........
2^0位图需要512/32 = 16个unsigned int元素。
假设现在,index = 1023, order = 0 ,那么是MARK_USED(511, (area)->map)
按照我的理解,MARK_USED只能修area->map指向的第一个元素,而后元素的不能修改,这样己不能完成伙伴算法,我哪里理解错了,求指点。 |
|