news 2026/10/8 19:39:46

page_alloc set_buddy_order

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
page_alloc set_buddy_order

设置空闲伙伴页块的阶数。它是在页块被释放进伙伴系统(或从伙伴系统取出)时,用来在struct page的private字段里记录"这个空闲块有多大"的辅助函数。


一、函数签名

static inline void set_buddy_order(struct page *page, unsigned int order)

参数

参数类型含义
pagestruct page *页块的首页(head page)
orderunsigned int该空闲页块的阶数

返回值

  • void。

static inline

  • 文件内私有 + 强制/建议内联。

  • 在伙伴系统的分配/释放/合并热路径上频繁调用,必须零开销。


二、背景:空闲页块的阶数存在哪?

struct page的private字段

struct page有一个联合体字段,其中一个成员是:

struct { ... unsigned long private; ... };
  • private是一个unsigned long,不同场景下复用:

    • 在buffer_head场景,指向 buffer_head;

    • 在slab场景,指向 slab 相关结构;

    • 在伙伴系统空闲页场景,存 order。

关键约定

  • 当一个页块空闲、挂在伙伴系统free_area[order]链表上时:

    • 它的首页(head page)的private字段存order;

    • 这样从链表取出页块时,能立刻知道它有多大。

  • 当页块被分配出去后,private可能被其他用途复用(如 buffer_head),所以 order 信息不再有效。

set_buddy_order()就是写这个字段

static inline void set_buddy_order(struct page *page, unsigned int order) { set_page_private(page, order); __SetPageBuddy(page); }

逐步说明

1. 记录 order

set_page_private(page, order);
  • set_page_private(page, value)是内核提供的封装:

    • 把page->private设为value;

    • 通常还带一些调试/类型检查(如VM_BUG_ON_PAGE)。

  • 这里把order写进private。

2. 标记为 Buddy 页

__SetPageBuddy(page);
  • 设置PG_buddy标志位(__SetPageBuddy是底层、不加额外检查的版本)。

  • 表示"这个页当前是伙伴系统里的空闲页"。

  • 这是状态标记,用于:

    • free_pages_prepare()时检测双重释放(已 Buddy 又被释放);

    • bad_page()检测非法状态;

    • 区分"空闲伙伴页"与"已分配页"。

对应的读取/清除

  • 读 order:

    static inline unsigned int buddy_order(struct page *page) { VM_BUG_ON_PAGE(!PageBuddy(page), page); return page_private(page); }
  • 清除 Buddy 状态(页被分配出去时):

    __ClearPageBuddy(page); set_page_private(page, 0);

    或封装成rmv_page_order()之类。


三、在伙伴系统中的位置

释放页块时(__free_one_page())

static inline void __free_one_page(struct page *page, unsigned long pfn, struct zone *zone, unsigned int order, int migratetype, fpi_t fpi_flags) { ... /* 合并伙伴,最终确定 order */ while (order < max_order - 1) { buddy_pfn = __find_buddy_pfn(pfn, order); buddy = page + (buddy_pfn - pfn); if (!page_is_buddy(page, buddy, order)) // 检查 buddy 是否空闲且同阶 break; /* 合并 */ list_del(&buddy->lru); ... order++; } ... /* 把合并后的页块加入 free_area[order] */ set_buddy_order(page, order); list_add(&page->lru, &zone->free_area[order].free_list[migratetype]); ... }
  • 合并完成后,用set_buddy_order(page, order)记录最终阶数并标记 Buddy。

  • 然后挂到对应free_area[order]链表。

分配页块时(__rmqueue_smallest()/expand())

  • 从free_area[order]取出页块后:

    • rmv_page_order(page):清除 Buddy 状态和 private;

    • 若需要分裂(expand()),把大块拆成小块,每块重新set_buddy_order()后放回对应链表。

page_is_buddy()检查

static inline int page_is_buddy(struct page *page, struct page *buddy, unsigned int order) { if (!PageBuddy(buddy)) return 0; if (buddy_order(buddy) != order) return 0; ... return 1; }
  • 判断"伙伴页是否空闲且同阶",才能合并。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/8 19:39:45

Ubuntu系统安装Mavros巨坑报错

简介:继续更新一些报错和AI使用问题&#xff08;如果有帮助&#xff0c;记得点赞关注我&#xff0c;我会继续更新难解决的报错&#xff0c;其他帖子也有一些报错解决和AI使用注意事项&#xff09; 目录&#xff1a; 1&#xff1a;报错 2&#xff1a;ai问题 3:具体解决方法 一&a…

作者头像 李华
网站建设 2026/10/8 19:37:54

【AI大模型】显存占用过高:推理显存优化技巧全总结

【AI大模型】显存占用过高:推理显存优化技巧全总结 核心结论:大模型推理显存高,占用主要来自三部分:模型权重、KV Cache、激活与临时张量。要降低显存,最有效的三板斧是量化压缩权重、控制KV Cache规模、精简上下文与输出长度;再辅以分片加载、梯度释放、内存碎片治理等…

作者头像 李华
网站建设 2026/10/8 19:33:59

小白程序员如何抓住机遇拿高薪?大模型Agent落地经验是关键!

Meta裁员潮加速AI赛道发展&#xff0c;程序员职业面临变革。掌握大模型和Agent项目经验成为高薪就业的关键。本文介绍了如何通过系统学习&#xff0c;掌握AI大模型技术&#xff0c;满足企业需求&#xff0c;实现高薪就业。课程涵盖基础理论、实战项目&#xff0c;助力成为合格的…

作者头像 李华
网站建设 2026/10/8 19:32:19

Blazor Admin 关联表怎么处理?Navigate、Include、Join 实战

后台开发里关联表几乎是必选项&#xff1a;订单要显示客户名、文章要选专栏、用户要分配角色、菜单要挂父子。这篇讲 EasyAdminBlazor 里关联数据从建模到查询、展示、编辑的完整做法。 一、四种关联&#xff0c;四种 Navigate 写法 FreeSql 用 [Navigate] 描述关联&#xff0…

作者头像 李华
网站建设 2026/10/8 19:27:46

theme-factory - desert-rose

沙漠玫瑰&#xff08;Desert Rose&#xff09; 一个柔和精致、带有灰粉色调的主题&#xff0c;非常适合优雅的演示。 调色板 灰玫瑰粉&#xff08;Dusty Rose&#xff09;&#xff1a;#d4a5a5 - 柔和的主色陶土色&#xff08;Clay&#xff09;&#xff1a;#b87d6d - 质朴的点缀…

作者头像 李华
网站建设 2026/10/8 19:26:47

基于springboot宠物领养系统-计算机毕设 附源码【课程设计】94217

摘要城市流浪动物数量持续增长&#xff0c;传统线下领养模式面临信息不对称、流程不透明、匹配效率低下等多重困境。宠物领养需求与救助资源之间缺乏有效连接渠道&#xff0c;导致大量宠物无法找到合适家庭。互联网技术发展为解决这一问题提供了新路径。基于Spring Boot框架构建…

作者头像 李华