免费注册 查看新帖 |

Chinaunix

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

伙伴算法 [复制链接]

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-22 11:58 |只看该作者 |倒序浏览
5可用积分
伙伴算法里分为 2^0 -2^11 ,有free_area[11]数组,每个数组都有free_list,指向空闲的page

伙伴算法初始化的后,free_area数组每个元素里的free_list是不是空的?

最佳答案

查看完整内容

要看你怎么理解初始化了. 实际上,伙伴系统的初始化是一个过程, 伙伴系统初始化可以看成是由 bootmem allocator完成, 与伙伴系统相关的主要有两步以2.6.11代码为例:1 bootmem的早期, 在初始化zone的过程共会调用free_area_init_core, 该函数调用 zone_init_free_lists.可以看到,free_area数组每个元素里的free_list的确是空的.2. 在bootmem的后期, 会把初始化后未用到的页面全部释放给buddy.在mem_init()函数中有如下代码, 注意最 ...

论坛徽章:
0
2 [报告]
发表于 2010-04-22 11:58 |只看该作者
本帖最后由 baozhao 于 2010-04-22 14:13 编辑
伙伴算法初始化的后,free_area数组每个元素里的free_list是不是空的?


要看你怎么理解初始化了. 实际上,伙伴系统的初始化是一个过程, 伙伴系统初始化可以看成是由 bootmem allocator完成, 与伙伴系统相关的主要有两步

以2.6.11代码为例:

1  bootmem的早期, 在初始化zone的过程共会调用free_area_init_core, 该函数调用  zone_init_free_lists.
可以看到,free_area数组每个元素里的free_list的确是空的.
  1. void zone_init_free_lists(struct pglist_data *pgdat, struct zone *zone,
  2.                                 unsigned long size)
  3. {
  4.         int order;
  5.         for (order = 0; order < MAX_ORDER ; order++) {
  6.                 INIT_LIST_HEAD(&zone->free_area[order].free_list);
  7.                 zone->free_area[order].nr_free = 0;
  8.         }
  9. }
复制代码
2. 在bootmem的后期, 会把初始化后未用到的页面全部释放给buddy.
在mem_init()函数中有如下代码, 注意最初的注释以及__free_all_bootmem和set_highmem_pages_init函数,这两个函数都将调用__free_pages或__free_page函数将空闲页面加入相关的freelist
  1. /* this will put all low memory onto the freelists */
  2.         totalram_pages += __free_all_bootmem();

  3.         reservedpages = 0;
  4.         for (tmp = 0; tmp < max_low_pfn; tmp++)
  5.                 /*
  6.                  * Only count reserved RAM pages
  7.                  */
  8.                 if (page_is_ram(tmp) && PageReserved(pfn_to_page(tmp)))
  9.                         reservedpages++;

  10.         set_highmem_pages_init(bad_ppro);
复制代码

论坛徽章:
0
3 [报告]
发表于 2010-04-22 21:47 |只看该作者
我刚看的伙伴系统初始化~ arm架构 2.6.29内核~

分为2部分:
1.使用bitmap来管理内存页,每bit代表1页内存的状态,使用bitmap来静态分配内存,多用于固定的资源初始化,例如页表,必须使用的IO映射,initrd之类
2.初始化完成以后释放bitmap,bitmap中的空闲页将归伙伴系统管理,伙伴系统一开始是个空链表,bitmap每释放N页个页面就按照N个页面的order值来组成伙伴系统

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
4 [报告]
发表于 2010-04-27 17:55 |只看该作者
多谢两位
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP