内存管理篇-09伙伴系统初始化一:memblock管理

news2024/9/20 16:36:55

1.伙伴系统的初始化概述

硬件初始化:计算机加电后进行硬件检测。加载引导程序,将Linux内核加载到内存中。

内核初始化:内核被加载后开始初始化各个子系统。进行CPU架构相关的初始化。初始化内存控制器和其他设备驱动。

内存管理初始化:在内核初始化的过程中,会调用mm_init函数来初始化内存管理系统。mm_init函数会初始化包括伙伴系统在内的各种内存管理组件

伙伴系统初始化

  • 伙伴系统的初始化通常发生在内存管理初始化阶段,即mm_init函数执行期间。
  • 首先,初始化与伙伴系统相关的数据结构,如struct zone等。
  • 然后,将由初始内存分配器(如memblock allocator)管理的内存空间释放到伙伴系统中
  • 在初始化过程中,会对每个节点(node)建立内存分配的zone优先级列表。
  • 对于x86架构,高端内存和低端内存的伙伴系统初始化是分开进行的,一般先初始化高端内存区,再初始化低端内存区。

初始化完成

  • 完成伙伴系统的初始化后,内核就可以使用伙伴系统来管理物理内存的分配和回收

所以伙伴系统的舒适化需要依赖memblock分配器释放到伙伴系统,因此需要先研究memblock。

2.伙伴系统初始化问题

        内核如何获取内存的地址、大小。整个内存已经被分为了相同大小的页帧,如何管理他们,如何将空闲页面放到伙伴系统呢?伙伴系统的初始化通常发生在内存管理初始化阶段,即mm_init函数执行期间。

(1)获取到内存区域的起始地址和大小(手册会规定dram区域的起始和结束)。

(2)伙伴系统的初始化(对物理内存管理)前:物理内存划分物理页帧后,需要填充到伙伴系统的链表上。系统启动初始化之后,有很多内存已经被占用了或者被保留起来了(例如dma,内核镜像等等)。因此,伙伴系统介入之前,整个内存是断断续续的。

(3)我们需要了解早期伙伴系统初始化之前的内存管理状态:此时需要先获取内存的管理信息(前面已经有memblock的管理了)。此时有一个全局变量struct memblock memblock保存了很多信息,记录了哪些被占用,占用多大等等。此时需要把空余的给伙伴系统进行管理。最终经过,memblock分配器的管理后,struct memblock memblock结构体的结构大概如下面所示,

(4)struct memblock memblock变量有两个信息:memory和reserved指针分别指向两个数组。数组里面是memblock_region类型的变量,记录了一段一段的空间。

 3. 全局变量:struct memblock memblock

如上图所示,很详细。

  • 可用物理内存:memblock.memory
  • reserve的物理内存:memblock.reserved
    • 内核镜像、dtb、uboot、页表
    • GPU

4.编程接口

        扫描物理内存上的块添加到memblock:memblock_add(phys_addr_t base, phys_addr_t size);删除使用memblock_remove(),什么情况下使用删除呢??

for_each_mem_range;遍历各个mem区域:

int memblock_reserve:主要是对memblock_type结构体reserve。该函数用于预留指定的物理内存区域,防止这部分内存被其他初始化过程使用。

int memblock_free: 主要是对memblock_type结构体free。该函数用于释放之前预留的物理内存区域,使其可用于其他用途。

memblock_add  该函数用于向memblock系统添加一个新的内存区域。

memblock_remove   该函数用于向memblock系统移除一个内存区域。

这些函数接口主要都是在memblock初始化过程中使用

通过调试接口查看信息:底下的reserved各个段就是memblock_type free指向的内容。

cat /sys/kernel/debug/memory

cat /sys/kernel/debug/reserved

5.memblock初始化

        Linux的memblock(内存块)系统是一种早期的内存管理机制,用于在内核完全初始化之前管理物理内存。它在内核启动早期使用,直到完整的内存管理系统(包括伙伴系统)初始化完成为止。

  1. 内核加载:当计算机启动时,BIOS/UEFI加载内核映像到内存,并跳转到内核的入口点开始执行。
  2. 基本硬件初始化:内核会进行一些基本的硬件初始化工作,比如设置CPU寄存器、中断控制器等。
  3. 内存检测:内核通过读取ACPI表或者通过内存检测来获取可用内存的信息。
    1. memblock模块加载:在内核加载早期,会加载memblock模块,用于管理内存。
    2. memblock初始化函数memblock_init函数被调用来初始化memblock系统。
    3. 初始化struct memblock结构体,这是memblock的核心数据结构,用于管理内存信息。设置全局变量memblock指向struct memblock实例。注册memblock_reserve和memblock_free等函数,用于在初始化过程中预留和释放内存。在内核初始化过程中,某些内存区域需要被预留,例如用于设备映射的内存。使用memblock_reserve函数来预留这些内存区域。
    4. struct memblock_region定义了内存区域的起始地址、结束地址以及是否可用等属性。使用memblock_add_*函数添加新的内存区域。所以终态就是把整个内存都处理好了,放到memory或者reserved

注意:early_init_dt_scan_memory函数主要用来初始化memory数组。early_init_fdt_scan_reserved_mem用来初始化reserved数组。最终状态就是将mem_block_memory_init_region和mem_block_reserved_init_region整个数组。 

总结下来主要有两个过程:

(1)获取物理内存的起始地址和大小:直接扫描设备树文件

(2)初始化全局变量memblock的两个数组

设备树中描述了memory和reserve的节点。所有的节点信息都是通过例如

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

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

相关文章

Chat App 项目之解析(四)

Chat App 项目介绍与解析(一)-CSDN博客文章浏览阅读76次。Chat App 是一个实时聊天应用程序,旨在为用户提供一个简单、直观的聊天平台。该应用程序不仅支持普通用户的注册和登录,还提供了管理员登录功能,以便管理员可以…

Nature Communications | 全球草地土壤碳储量随植物多样性的增加而增加

在许多生态系统中物多样性与土壤有机碳(SOC)储量呈正相关。最可能的原因是植物多样性积极影响植物生产力,从而影响土壤的有机碳输入量。大多数关于植物多样性对植物生产力和有机碳储量影响的证据都是基于控制植物物种丰富度的小规模实验。然而,那些短期的…

Flink入门(五)--Flink算子

Map DataStream → DataStream 一个接受一个元素并产生一个元素的函数。 示例 dataStream.map { x > x * 2 } FlatMap DataStream → DataStream 一个接受一个元素并产生零个、一个或多个元素的函数。 例如 dataStream.flatMap { str > str.split(" ") }…

把直播间搬到工厂,淘宝直播打造卖爆新路径

又一年中秋将至,电商平台们再度开启了月饼生意。 8月21日,杭州,淘宝直播的主播们组成“白月光”队和“黑月牙”队,下工厂,探访体验馆,开始了一场“寻月之旅”。“我们米月饼的饼皮是根据南宋糕点改良而来”…

C语言小项目源码大全(60套)

C语言小项目源码大全60套 目录源码文件 目录 纯c语言迷宫源码.exe . c语言五子棋源码.exe c语言24点游戏源码.exe c语言万年历源码.exe c语言别踩白块儿(双人版)源码.exe c语言奔跑的火柴人游戏源码.exe c语言吃逗游戏源码.exe C语言超市管理系统.exe c语言对对碰游戏…

【CSP:202212-2】训练计划(Java)

题目链接 202212-2 训练计划 题目描述 求解思路 模拟: over表示能否按时完成所有训练项目rely[i]表示第i个项目的依赖项目编号(每个项目最多有一个依赖项目)days[i]用来记录第i个项目完成需要的天数allDays[i]表示加上该项目的所有前置依赖…

面向对象09:instanceof和类型转换

‌ 本节内容视频链接:https://www.bilibili.com/video/BV12J41137hu?p72&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p72&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 instanceof是Java中的一个二元运算符&…

浅谈【数据结构】栈和队列之队列

目录 1、队列 1.1思想 2、队列的两类 2.1顺序队列 2.2链式队列 谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注 没错,说的就是你,不用再怀疑!!! 希望我的文章内容能对你有帮助,一起努力吧&a…

MATLAB 沿任意方向分层点云(82)

MATLAB 沿任意方向分层点云(82) 一、算法介绍二、算法实现1.代码2.效果更多内容参考: MATLAB点云处理学习 一、算法介绍 沿着某个方向,将点云分割为多层,每层点云使用不同颜色进行可视化显示,具体代码和不同方向的分层效果如下: 二、算法实现 1.代码 % Load point c…

学生信息管理系统的设计与实现(包含文档、源码、sql脚本、导入视频教程)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 学生信息管理系统拥有三种角色,分别为学生、教师和管理员,功能更加完善,可以作为初学者参照学习课程设计。 学生:班级通讯录查询、个人信息…

一键生成PPT只需这一步!AI先行者全面指南

在当今快节奏的工作生活中,我们需要不断地准备各种报告和演示文稿。传统的PPT制作方式往往耗费大量时间和精力,而AI先行者的出现改变了这一切。这款强大的智能工具能够帮助您快速生成高质量的PPT,提高工作效率。今天,我们将为您带…

CLASS1:文献管理软件使用

1 文献查阅 引新(3年内)不引旧引用经典2 文献检索网站汇总 Web of Science(论文中了之后下载证明) Author Search - Web of Science Core Collection (clarivate.cn) X-MOL(查阅文献) X-MOL学术平台 计算机, 热门类期刊, - X-MOL Scidown(下载原文) Sci论文期刊检索|

zabbix监控进程、日志、主从(状态、延迟)

环境:rocky Linux9虚拟机四台,zabbix端为服务端,node6为客户端,node4为mariadb主,node7为mariadb从 一、zabbix监控进程 以httpd服务为例 1、客户端安装httpd [rootnode6 ~]# yum -y install httpd [rootnode6 ~]#…

微服务Gateway服务⽹关

一、Gateway服务⽹关 1.1为什么需要⽹关 Gateway⽹关是我们服务的守⻔神,所有微服务的统⼀⼊⼝。 ⽹关的核⼼功能特性: 请求路由和负载均衡:⼀切请求都必须先经过gateway,但⽹关不处理业务,⽽是根据某种规则&…

专利写作笔记

最近又要写专利,每次写专利的时候都找不到之前的专利笔记,这次发到网站上记录一下。 专利文件:1.权利要求书、2.说明书、3.说明书附图、4.说明书摘要、5.摘要附图 明确三点:①和现有方案的区别点(哪个步骤不同&#x…

【02】ctf工具ECCTOOL工具的安装和使用

2.ECCTOOL工具的安装和使用 工具的介绍: 一款非常好用的计算ECC的工具,可以处理一些小数值的计算,点击就可以使用,非常方便实用,具体的使用方法可以参考下面图中的介绍,解决一定的ECC椭圆曲线的问题&…

4款在线视频压缩工具,帮你的视频文件 轻松“瘦身” 。

设备里面视频太多,内存不够怎么办?视频文件太大不好传输怎么办?视频文件大小受规则限制怎么办? 别担心!有了这4款视频压缩软件,轻轻松松帮你搞定这些问题。 1、福昕视频高效压缩 直通车:www.f…

进制转换计算幸运数出现次数(华为od机考题)

一、题目 1.原题 有位客人来自异国&#xff0c;在该国使用m进制计数。 该客人有个幸运数字n(n<m)&#xff0c;每次购物时&#xff0c; 其总是喜欢计算本次支付的花费(折算为异国的价格后)中存在多少幸运数字。 问&#xff1a;当其购买一个在我国价值k的产品时&#xff0c;…

AI在医学领域:GluFormer一种可泛化的连续血糖监测数据分析基础模型

糖尿病是一种全球性的健康挑战&#xff0c;影响着各个年龄段和不同地理区域的人群。根据最新数据&#xff0c;全球糖尿病患者人数已超过5亿&#xff0c;且每年以惊人的速度增长&#xff0c;相关的医疗费用也居高不下。2型糖尿病&#xff08;T2DM&#xff09;作为最主要的糖尿病…

lit-llama代码笔记--LLaMA Model

代码来自&#xff1a;lit-llama modelscope模型下载 &#xff1a;llama-7b 下载后的模型需要转换为lit-llama使用的格式&#xff0c;详见 howto 文件夹下的 download_weights.md 文中代码为了方便说明&#xff0c;删减了一些内容&#xff0c;详细代码请查看源码。 generate …