免费注册 查看新帖 |

Chinaunix

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

[内存管理] buddy 计算page_idx的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-21 19:49 |只看该作者 |倒序浏览
arm linux 2.6.35, 在free page的时候,计算待free page的index是这样的:

page_idx = page_to_pfn(page) & ((1 << MAX_ORDER) - 1); //MAX_ORDER = 11
对应的编号从0 ~ 2047

然而最大的block只有1024个page(2^(MAX_ORDER - 1)),那为何这里不是这样:

page_idx = page_to_pfn(page) & ((1 << (MAX_ORDER - 1)) - 1);
这样对应的编号不正好是0 ~ 1023么?

论坛徽章:
0
2 [报告]
发表于 2012-11-22 22:37 |只看该作者
跟踪了一下程序,某次调用free_page的时候,算出来的page_idx是1088,buddy_idx是1120,都超过了1023,这两个值算什么意义??

论坛徽章:
0
3 [报告]
发表于 2012-11-24 21:33 |只看该作者
回复 1# leslielg


    感觉是有点玄乎……虽然并不影响后面的buddy的计算。。

论坛徽章:
0
4 [报告]
发表于 2012-12-20 16:25 |只看该作者
同样没发现有啥实际意义,__free_pages_bulk函数用page_idx来找出buddy块的第一个page和order+1的块的第一个page。不影响其buddy分配。

论坛徽章:
0
5 [报告]
发表于 2012-12-20 22:06 |只看该作者
我也刚看到这里.

page_idx 和 buddy_idx 的关系.有点点模糊. 也望LZ和各位多指点.

struct page *buddy, *base = zone->zone_mem_map;
unsigned long buddy_idx, page_idx = page - base;
buddy_idx = page_idx ^ (1 << order);
buddy = base + buddy_idx;

这里怎么由页表项 page 的线性地址来处理的呢? 还有, page_idx 可能为0吗?

最后,
page_idx = page_idx & buddy_idx;

论坛徽章:
0
6 [报告]
发表于 2012-12-21 15:39 |只看该作者
计算当前order阶的伙伴索引值:buddy_idx=page_idx ^ (1 << order);
page_idx是待放入伙伴系统的物理页索引;
order是待放入伙伴系统的物理页的阶数;
buddy_idx是待放入伙伴系统的物理页在order阶链表上的伙伴物理页索引;

计算放入order+1阶的伙伴索引值:compound_idx = page_idx & ~(1<<order);
page_idx和order如上所述;
compound_idx是待放入伙伴系统的物理页在order+1阶链表上的伙伴物理页索引;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP