引导内存分配器 Buddy 分配器的关系

引导内存分配器 Buddy 分配器的关系

在 Linux 内核启动的早期阶段,物理内存管理面临着一个“鸡生蛋,蛋生鸡”的问题:内核需要分配内存来初始化用于内存管理的数据结构(如struct page数组),但此时完善的 Buddy 分配器尚未建立。为了解决这个问题,内核引入了简单的引导内存分配器

一、为什么需要引导内存分配器?

在内核启动初期,内存管理子系统尚未初始化完成,主要面临以下挑战:

  1. 元数据未就绪:描述物理内存的mem_map(页描述符数组)尚未分配和初始化。
  2. Buddy 系统未工作:Buddy 算法依赖于struct zonestruct page等结构,在这些结构就绪前无法工作。
  3. 早期分配需求:内核在初始化阶段就需要分配内存,例如用于存放内核页表、设备树(Device Tree)解析结果、initrd 镜像等。

因此,内核需要一个简单、临时的内存分配机制,这就是引导内存分配器。它仅在启动阶段工作,一旦 Buddy 系统初始化完成,引导内存分配器就会将管理权移交出去并退役。

二、两种引导内存分配器:bootmem 与 memblock

随着 Linux 内核的发展,引导内存分配器也经历了演变。

1. bootmem 分配器 (旧架构)

bootmem是较早期的引导内存分配器,主要利用一个位图(bitmap)来管理内存。

  • 原理:使用一个位图,每一位代表一个物理页。如果该位为 1,表示该页已被占用;为 0 表示空闲。
  • 分配:采用最先适配算法(First Fit),扫描位图找到足够大的连续空闲区域。
  • 缺点
    • 位图本身需要占用内存,且随着内存容量增大,位图变得很大。
    • 在大型系统(如 NUMA)中,管理多个节点的 bootmem 结构复杂。
  • 现状:ARM64 架构内核已不再使用bootmem,但其他一些处理器架构仍在使用。

2. memblock 分配器 (新架构)

memblock是目前主流(包括 ARM64)使用的引导内存分配器,用于替代bootmem

  • 数据结构:它维护两个列表(数组):
    • memory:描述系统所有可用的物理内存范围。
    • reserved:描述已经被预留、占用的内存范围。
  • 原理
    • memblock不使用庞大的位图,而是直接管理“内存区域(Region)”的数组。
    • 当需要分配内存时,它在memory列表中查找空闲空间,并将其添加到reserved列表中。
  • 优点
    • 结构更紧凑,开销小。
    • 支持从设备树(DTS)直接获取内存布局信息。
    • 支持热插拔(Hotplug)和复杂的 NUMA 配置。
    • memblock_add添加内存,memblock_remove移除内存,memblock_alloc分配内存。

三、引导分配器与 Buddy 分配器的交接

引导内存分配器是一个临时的“管家”,它的最终使命是将内存管理权平稳过渡给 Buddy 分配器。这个过程发生在内核初始化函数mm_init()流程中。

交接流程:

  1. 收集内存信息

    • 内核启动时,首先通过解析设备树(DTS)或 BIOS/UEFI 获取物理内存布局。
    • 调用memblock_add()将物理内存范围注册到引导分配器中。
  2. 早期分配服务

    • 在 Buddy 系统建立前,内核各子系统的内存申请(如页表分配)都由memblock_alloc()处理。
  3. 协助建立 Buddy 结构

    • 内核利用引导分配器分配的内存,来创建和初始化 Buddy 系统所需的关键数据结构,主要是mem_map(存放所有的struct page)。
  4. 释放空闲内存给 Buddy

    • 当 Buddy 系统的数据结构初始化完成后,内核会调用类似memblock_free_all()free_all_bootmem()的函数。
    • 核心动作:遍历引导分配器中发现的所有未使用的空闲页,将它们逐个(或成块)释放给 Buddy 系统(通过调用__free_pages等接口)。
    • 此时,这些页会被标记为空闲,挂入 Buddy 系统的free_area链表中,正式成为 Buddy 系统的可分配资源。
  5. 引导分配器退役

    • 一旦空闲内存全部移交完毕,引导分配器的数据结构本身所占用的内存也会被释放(如果可能),或保留作为存根。
    • 此后,所有的内存申请(包括内核和用户空间)都必须通过 Buddy 分配器(如alloc_pages,kmalloc)进行。

四、总结

特性引导内存分配器 (memblock/bootmem)Buddy 分配器
生命周期仅限于内核启动早期内核初始化完成后一直运行
管理粒度粗粒度的物理地址范围精细的页框 (Page Frame)
算法复杂度简单(线性扫描/数组管理)复杂(阶梯链表、反碎片、LRU等)
主要职责1. 临时响应早期分配请求
2. 协助初始化 Buddy 的元数据
3. 将空闲内存移交给 Buddy
系统运行时的通用物理内存管理

简而言之,引导内存分配器是 Buddy 分配器的前置加载器。它在荒芜的物理内存上建立起最基础的秩序,为构筑宏大的 Buddy 内存帝国铺平道路,并在完成使命后功成身退。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1125958.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Buddy分配器

Buddy分配器 1. 内核在基本的伙伴分配器基础改进扩展 支持内存节点和区域,称为分区的伙伴分配器(zoned buddy allocator)。 为了预防内存碎片,把物理页框通过移动性分组。 针对分配单页做了性能优化,为了减少处理器锁的…

AI模型容器化部署实战

💓 博客主页:借口的CSDN主页 ⏩ 文章专栏:《热点资讯》 AI模型容器化部署:实战指南与未来展望目录AI模型容器化部署:实战指南与未来展望 引言 一、容器化部署的必要性与当前挑战 为什么需要容器化? 现存挑战…

Slab,不连续页,buddy分配器与内存映射

Slab分配器分析 一、Slab分配器概述 1.1 Slab分配器的作用 Slab分配器是Linux内核中用于管理小对象内存分配的高效机制。它主要解决以下问题: 频繁分配/释放小对象的性能问题:内核中大量使用固定大小的对象(如task_struct、inode、dentry等&a…

物理内存组织架构与Buddy分配器关系分析

物理内存组织架构与Buddy分配器关系分析 在Linux内核中,物理内存的管理是一个分层级的复杂系统。为了高效地应对不同硬件架构(如NUMA)和不同的内存需求(如DMA访问限制),Linux建立了严密的物理内存组织架构…

【数据分享】2025年全国范围各城市的公交路线及站点数据(分省/分城市)

本文分享一份2025年全国范围各城市的路线及站点数据。包含:安徽省、澳门、北京市、重庆市、福建省、甘肃省、广东省、广西省、贵州省、海南省、河北省、河南省、黑龙江、湖北省、湖南省、吉林省、江苏省、江西省、辽宁省、内蒙古、宁夏省、青海省、山东省、山西省、…

Agent2Agent (A2A) Protocol( A2A 协议)简介、组件

Agent2Agent (A2A) Protocol(简称 A2A 协议)是旨在让不同 AI 代理(agents)之间互联互通、协作的开放标准。内容包括协议的主要组件(building blocks)、各组件作用,以及这些组件在一个典型流程中…

期货反向跟单—从小白到高手进阶历程 六十三(研究人性不是重点)

在期货反向跟单领域,“研究人性” 似乎成了多数团队的共识性动作。不少团队投入大量人力、物力搭建心理干预体系,从资金奖惩机制到每日口头引导,试图通过干预盘手的心理状态来优化跟单效果。然而现实往往事与愿违,多数团队耗费数月…

系列教程十三 | 探索阿里云 Wan 2.1:零基础入门文本生成视频教程

一.背景介绍近年来,人工智能内容生成(AIGC)在视频创作领域取得了突破性进展,其中文本到视频(Text-to-Video)生成技术因其在内容创作、广告营销和教育可视化等方面的巨大潜力而备受关注。Wan 2.1作为阿里云推…

系列教程十四 | 基于CosyVoice 2.0实现语音风格迁移

一.背景介绍 随着生成式人工智能的快速发展,语音合成(Text-to-Speech, TTS)技术正在迈向更自然、更智能、更具情感表达的新时代。过去的 TTS 模型虽然已在音质和语义准确度方面取得显著进步,但在跨语言、情感表达、个性化模拟等方…

外包开发三年

外包开发的三年:困在代码牢笼里的日子这三年就像被困在一座没有出口的迷宫,每天重复着同样的路线,却永远走不到尽头。刚入行时还带着点期待,想着好歹能攒点经验,可现实像一盆冷水,从头顶浇到脚底。外包公司…

解析ASTM D4169:运输包装性能测试的核心标准有哪些

ASTM D4169 是国际公认的运输集装箱和系统性能测试标准,通过模拟真实分销环境中的各类危险元素,为包装运输性提供统一评估依据。该标准包含多个分配周期(DC),其中 DC4、DC6、DC12、DC13 是医疗行业界最常选用的周期&am…

提示工程的认知架构设计:架构师的深度思考

提示工程的认知架构设计:架构师的深度思考 引言:AI时代的认知革命 在人工智能技术迅猛发展的今天,提示工程(Prompt Engineering)已经从一项简单的交互技巧演变为一门系统的工程学科。作为架构师,我们需要超越表面的指令编写,深入思考提示工程背后的认知架构设计。这不仅…

Java Web 企业客户管理系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

摘要 随着信息技术的快速发展,企业客户管理系统的需求日益增长,传统的手工管理模式已无法满足现代企业对高效、精准客户管理的需求。企业客户管理系统能够有效整合客户信息,优化业务流程,提升客户满意度和企业竞争力。当前&#x…

网上超市设计与实现信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

摘要 随着互联网技术的快速发展和电子商务的普及,网上超市逐渐成为消费者购物的主要渠道之一。传统的线下超市面临着租金成本高、管理效率低、客户覆盖面有限等问题,而网上超市能够突破时间和空间的限制,为消费者提供更加便捷的购物体验。同时…

Java SpringBoot+Vue3+MyBatis 在线文档管理系统系统源码|前后端分离+MySQL数据库

摘要 随着信息技术的快速发展,文档管理已成为企业和个人高效工作的核心需求。传统的文档管理方式依赖本地存储或简单的文件共享工具,存在版本混乱、协作效率低、安全性不足等问题。在线文档管理系统通过云端存储和实时协作功能,能够有效解决这…

大数据诊断性分析:从入门到精通的完整指南

大数据诊断性分析:从入门到精通的完整指南 一、引言:为什么你做了一堆报表,却还是找不到问题的根因? 你有没有过这样的经历? 月底盯着复购率下降20%的报表抓耳挠腮,翻了几十张用户行为折线图,…

【2025最新】基于SpringBoot+Vue的甘肃非物质文化网站管理系统源码+MyBatis+MySQL

💡实话实说:CSDN上做毕设辅导的都是专业技术服务,大家都要生活,这个很正常。我和其他人不同的是,我有自己的项目库存,不需要找别人拿货再加价,所以能给到超低价格。摘要 非物质文化遗产作为中华…

快速排序 - 原理、时空分析、优化

过程 快速排序分为三个过程: 将数列根据划分值 mmm 划分为两部分;递归到两个子序列中分别进行快速排序;不用合并,因为此时数列已经完全有序。 具体来说,第一步要是要把数列分成两个部分,然后保证前一个子…

Java SpringBoot+Vue3+MyBatis 教师工作量管理系统系统源码|前后端分离+MySQL数据库

💡实话实说:CSDN上做毕设辅导的都是专业技术服务,大家都要生活,这个很正常。我和其他人不同的是,我有自己的项目库存,不需要找别人拿货再加价,所以能给到超低价格。摘要 随着教育信息化的快速发…