当前位置: 首页 > news >正文

内存管理-伙伴系统:__find_buddy_pfn 函数解析与伙伴查找机制

内存管理-伙伴系统:__find_buddy_pfn 函数解析与伙伴查找机制

文章目录

  • 内存管理-伙伴系统:__find_buddy_pfn 函数解析与伙伴查找机制
  • 伙伴系统合并机制概述
  • __find_buddy_pfn 函数解析
  • 伙伴系统初始化时的块分配规则
  • 实例分析
  • 合并场景补充
  • 总结

伙伴系统合并机制概述

伙伴系统的核心价值在于通过空闲块的合并减少内存碎片,而合并的前提是精准定位当前块的“伙伴”。__find_buddy_pfn函数的作用正是计算给定页帧号(Page Frame Number, pfn)在指定阶(order)下的伙伴页帧号。仅当伙伴块与当前块阶数相同且均为空闲状态时,才会触发后续的合并逻辑。

linux-5.10.202/mm/page_alloc.c:1018buddy_pfn=__find_buddy_pfn(pfn,order);// 相邻的伙伴块,按照 ^ (1 << order) 计算

__find_buddy_pfn 函数解析

__find_buddy_pfn是一个静态内联函数,通过位异或运算实现伙伴页帧号的快速计算,其源码与注释如下:

linux-5.10.202/mm/internal.h:156/* * Locate the struct page for both the matching buddy in our * pair (buddy1) and the combined O(n+1) page they form (page). * * 1) Any buddy B1 will have an order O twin B2 which satisfies * the following equation: * B2 = B1 ^ (1 << O) * For example, if the starting buddy (buddy2) is #8 its order * 1 buddy is #10: * B2 = 8 ^ (1 << 1) = 8 ^ 2 = 10 * * 2) Any buddy B will have an order O+1 parent P which * satisfies the following equation: * P = B & ~(1 << O) * * Assumption: *_mem_map is contiguous at least up to MAX_ORDER */staticinlineunsignedlong__find_buddy_pfn(unsignedlongpage_pfn,unsignedintorder){returnpage_pfn^(1<<order);}

以 pfn 8(二进制1000)、order 1 为例:该块包含连续 2 个页(pfn 8 和 9)。通过位异或运算8 ^ (1 << 1),得到伙伴页帧号为 10,对应块包含 pfn 10 和 11。后续逻辑会验证伙伴块是否处于相同阶且空闲,若满足则合并为 order 2 的块。

伙伴系统初始化时的块分配规则

伙伴系统初始化通过__free_pages_memory函数将内存块按阶对齐规则加入空闲链表,确保每个块的起始 pfn 是2^order的整数倍。源码如下:

linux-5.10.202/mm/memblock.c:1900staticvoid__init__free_pages_memory(unsignedlongstart,unsignedlongend)// 伙伴系统初始化,会按照 page 的 pfn 按阶存放 每个阶存档的page地址一定是 2**n 对齐{intorder;while(start<end){order=min(MAX_ORDER-1UL,__ffs(start));// ffs 第一个有 1 的 bit 位置 - 1,相当于根据 pfn 地址确定 orderwhile(start+(1UL<<order)>end)// 和 1912 行的 start += (1UL << order); 有联系,如果有连续大块,放到对应 orderorder--;memblock_free_pages(pfn_to_page(start),start,order);// 加入到伙伴系统start+=(1UL<<order);}}

函数逻辑拆解:

  1. __ffs(start)返回start二进制表示中第一个置 1 位的位置(从 0 计数),用于确定初始阶数;
  2. 通过内层循环动态降低阶数,确保块大小(1 << order)不超过剩余内存范围(startend);
  3. 调用memblock_free_pages将对齐后的块加入伙伴系统,并更新start指针处理下一段内存。

实例分析

以 pfn 1 到 13(共 12 个连续页)为例,展示初始化时的块分配逻辑:

pfnhex__ffs加入到伙伴的阶解释
11001 + (1 << 0) <= 13
210112 + (1 << 1) <= 13
3111跳过2 += (1 << 1)
4100224 + (1 << 2) <= 13
51012跳过4 += (1 << 2)
61102跳过4 += (1 << 2)
71112跳过4 += (1 << 2)

合并场景补充

若 pfn 3 变为 0 阶并释放,其伙伴为 pfn 2(计算:3 ^ (1 << 0) = 2),二者可合并为 1 阶块;同理,pfn 4 和 5 在 0 阶互为伙伴,合并为 1 阶后,可与 pfn 6-7 组成的 1 阶块进一步合并为 2 阶块(计算:4 ^ (1 << 1) = 6)。

总结

  1. 伙伴查找核心机制__find_buddy_pfn通过page_pfn ^ (1 << order)位异或运算,快速定位物理地址连续且对齐的伙伴页帧号,是伙伴系统合并逻辑的基础。
  2. 初始化对齐规则__free_pages_memory利用__ffs确定初始阶数,动态调整以适配内存范围,确保每个块按2^order对齐加入伙伴系统,为后续合并创造条件。
  3. 合并逻辑约束:仅当伙伴块阶数相同且均为空闲时,才会触发合并,通过逐步提升阶数有效减少内存碎片。
http://www.cnnetsun.cn/news/1663973.html

相关文章:

  • ContainerSSH审计日志分析:从二进制格式到可视化报告
  • 5步实战全攻略:罗技鼠标宏驱动绝地求生精准射击
  • 字节跳动 DeerFlow 2.0:超级智能体底座深度解析
  • Qwen3-VL-8B轻量级优势:单卡运行,速度快,效果不打折
  • 哔哩下载姬downkyi:3步搞定B站视频无水印下载的终极指南
  • Realistic Vision V5.1 快速上手教程:Python入门者也能玩转AI摄影
  • seo推广平台的报告数据如何看
  • 终极指南:5个Haraka负载均衡策略实现邮件流量智能分配
  • Kandinsky-5.0-I2V-Lite-5s与网络编程结合:构建分布式视频生成集群
  • 如何快速获取创意工坊壁纸:Wallpaper Engine下载器终极指南
  • PromptSource与问答系统:构建高精度QA提示模板的最佳实践
  • 终极Zephyr-7b-β复现指南:从Mistral到AI对齐模型的完整流程
  • Kandinsky-5.0-I2V-Lite-5s实际作品集:10组首帧图→5秒短视频高质量生成效果展示
  • 嵌入式RateLimiter:基于时间戳的轻量级速率控制原语
  • StructBERT WebUI实战案例:用rank_by_similarity实现客服问题TOP5智能排序
  • Windows Subsystem for Android (WSA) 终极指南:在Windows 11上无缝运行Android应用
  • Java学习路径规划师:Qwen3-0.6B-FP8为你定制个性化进阶指南
  • 千问3.5-2B镜像免配置优势解析:省去4.3GB权重下载,秒级启动视觉理解服务
  • Phi-4-mini-reasoning保姆级教学:Web服务健康检查失败的5类根因与对策
  • 像素特工Ostrakon-VL效果实测:上传货架图,AI秒变资深店长给出优化建议
  • Qwen3-VL-8B效果惊艳展示:看AI如何精准描述复杂场景图片
  • 软萌拆拆屋惊艳效果:多层叠穿服饰逐层展开结构图生成案例
  • 小白必看!Ollama+translategemma-12b-it图文翻译模型快速上手实战
  • MATLAB机械臂自适应模糊滑模控制代码:机器人滑膜控制、自适应控制、模糊控制及多种控制方法对比
  • LAV Filters专业配置进阶指南:深度解析开源解码器架构与性能优化
  • 人脸识别OOD模型实战落地:医保刷脸结算中质量分作为支付风控因子
  • AzurLaneAutoScript终极指南:碧蓝航线全自动游戏体验
  • seo优化服务价格一般是多少_网站快速排名对网站访问量有什么影响
  • QMCDecode:恢复音乐文件自由播放权的 macOS 工具
  • FUTURE POLICE惊艳效果:毫秒级语音字幕对齐实战演示