免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3384 | 回复: 8

提一个2.4.X内核物理内存申请的问题(rmqueue) [复制链接]

论坛徽章:
0
发表于 2007-04-19 11:42 |显示全部楼层
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;
}

论坛徽章:
0
发表于 2007-04-19 14:21 |显示全部楼层
>>>根据order值找到需申请的free_area。问题一,如order
为2,那么挂入free_area_t中的相邻的page数据结构是否间隔
为1,比如该free_area中的头一个page的序列号为10,第二个
为12,以此类推,如果order值为3则间隔为8,是否是这样挂进
的呢 ?

order 间隔 2^order

>>问题二 谁能解释一下,这个位图应该怎么理解?

标识对应的伙伴块的分配状态
左:左边伙伴块
右:右边伙伴块
0/1代表占用状态
bitmap:位图中的值
state:意义

  1. 左  右(占用否)   bitmap  state
  2. 0     0                  0      never happen
  3. 0     1                  1      buddy free
  4. 1     0                  1      buddy free
  5. 1     1                  0      both use
复制代码

[ 本帖最后由 qtdszws 于 2007-4-19 14:23 编辑 ]

论坛徽章:
0
发表于 2007-04-19 15:36 |显示全部楼层
另外set_page_count(page, 1);一句是增加页面的使用计数。如果我我的order大于1,那么用该句不是只把第一个page结构的计数值增1了吗?后边的页面呢?不用增加计数吗?

论坛徽章:
0
发表于 2007-04-19 15:42 |显示全部楼层
因为是作为一个整体分配的,所以只需要设置第一页的引用计数,由它代表

论坛徽章:
0
发表于 2007-04-19 16:13 |显示全部楼层
好像也只有这么解释才解释的通,等我再结合内存回收的代码对照着看看

论坛徽章:
0
发表于 2007-04-20 08:28 |显示全部楼层
还有个问题BAD_RANGE(zone,page)一句检验分配的页面块的范围是否正确。可只检验了分配的第一个页面。如果现在分配8个页面,第一个页面恰好处于正常页面范围的临界点,那后续页面不是就越界了吗?这种情况不是没有被检测到?

论坛徽章:
0
发表于 2007-04-20 09:50 |显示全部楼层
原帖由 dengcainiao 于 2007-4-20 08:28 发表于 6楼  
还有个问题BAD_RANGE(zone,page)一句检验分配的页面块的范围是否正确。可只检验了分配的第一个页面。如果现在分配8个页面,第一个页面恰好处于正常页面范围的临界点,那后续页面不是就越界了吗?这种情况不是没 ...


如果某个页面后面的页面不存在,那么分配order>0的数量的页面时,绝不可能返回该页面。

论坛徽章:
0
发表于 2007-04-20 09:53 |显示全部楼层
不是说不存在,是有可能越过了该管理区的范围

论坛徽章:
0
发表于 2007-04-20 13:18 |显示全部楼层
原帖由 dengcainiao 于 2007-4-20 09:53 发表于 8楼  
不是说不存在,是有可能越过了该管理区的范围


buddy是以管理区(zone)为单位进行管理的~~, 所以其它管理区的page对于本zone与不存在是以样的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP