免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2014 | 回复: 5
打印 上一主题 下一主题

[内存管理] linux2.4.0内核__alloc_page()-->rmqueue()位图操作的一个疑惑。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-05 23:50 |只看该作者 |倒序浏览
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指向的第一个元素,而后元素的不能修改,这样己不能完成伙伴算法,我哪里理解错了,求指点。

论坛徽章:
0
2 [报告]
发表于 2012-07-06 00:13 |只看该作者
我说的不清楚,没有人来回答?

论坛徽章:
0
3 [报告]
发表于 2012-07-06 08:51 |只看该作者
没有人拯救我吗?

论坛徽章:
0
4 [报告]
发表于 2012-07-06 21:34 |只看该作者
还是没有人吗?

论坛徽章:
0
5 [报告]
发表于 2012-07-10 17:50 |只看该作者
看来汇编还是差了点,最近看ARM汇编看的多,INTEL汇编落下不少啊。
static __inline__ void change_bit(int nr, volatile void * addr)
{
        __asm__ __volatile__( LOCK_PREFIX
                "btcl %1,%0"
                :"=m" (ADDR)
                :"Ir" (nr));
}
我对这个函数理解有误,才会觉得这个函数的对位图的操作不能实现buddy算法。

论坛徽章:
0
6 [报告]
发表于 2012-07-10 17:57 |只看该作者
主要是对btcl这条指令的作用理解有误,翻书也没翻到满意的解释,写了一个验证程序验证了下这条指令的作用,才知道他是一条什么样的指令,
也刚要验证了我对buddy算法中位图操作理解。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP