免费注册 查看新帖 |

Chinaunix

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

[内存管理] 伙伴系统释放函数__free_one_page 中page_idx指的是什么 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-11-07 19:11 |只看该作者 |倒序浏览
释放页到伙伴系统的最底层函数__free_one_page 中有一个不理解的地方:

函数
  1. static inline void __free_one_page(struct page *page,
  2.                 struct zone *zone, unsigned int order,
  3.                 int migratetype)
  4. {
  5.         unsigned long page_idx;

  6.         if (unlikely(PageCompound(page)))
  7.                 if (unlikely(destroy_compound_page(page, order)))
  8.                         return;

  9.         VM_BUG_ON(migratetype == -1);

  10.         page_idx = page_to_pfn(page) & ((1 << MAX_ORDER) - 1);

  11.         VM_BUG_ON(page_idx & ((1 << order) - 1));
  12.         VM_BUG_ON(bad_range(zone, page));

  13.         while (order < MAX_ORDER-1) {
  14.                 unsigned long combined_idx;
  15.                 struct page *buddy;

  16.                 buddy = __page_find_buddy(page, page_idx, order);
  17.                 if (!page_is_buddy(page, buddy, order))
  18.                         break;

  19.                 /* Our buddy is free, merge with it and move up one order. */
  20.                 list_del(&buddy->lru);
  21.                 zone->free_area[order].nr_free--;
  22.                 rmv_page_order(buddy);
  23.                 combined_idx = __find_combined_index(page_idx, order);
  24.                 page = page + (combined_idx - page_idx);
  25.                 page_idx = combined_idx;
  26.                 order++;
  27.         }
  28.         set_page_order(page, order);
  29.         list_add(&page->lru,
  30.                 &zone->free_area[order].free_list[migratetype]);
  31.         zone->free_area[order].nr_free++;
  32. }
复制代码


page_idx = page_to_pfn(page) & ((1 << MAX_ORDER) - 1); 这个 page_idx  到底是什么?


page_to_pfn:pfn = 0 page相当于mem_map[0],pfn = 1 ,page相当于mem_map[1],即page_to_pfn获得的是page的页帧号,这个没理解错吧?
pfn & ((1 << MAX_ORDER) - 1)这个获取的到底是什么?还有那个combined_idx我也不知道是什么?求解。




论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2016-11-08 17:32 来自手机 |只看该作者
我知道了。取余算法。终于看懂这个函数了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP