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

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.mzph.cn/diannao/52469.shtml

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

相关文章

Oracle开始严查Java许可!

0x01、 前段时间在论坛里就看到一个新闻,说“Oracle又再次对Java下手,开始严查Java许可,有企业连夜删除JDK”,当时就曾在网上引起了一阵关注和讨论。 这不最近在科技圈又看到有媒体报道,Oracle再次严查,对…

C语言典型例题51

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 例题4.3 while循环与do……while循环的比较 代码&#xff1a; &#xff08;1&#xff09;while语句 #include <stdio.h> int main() {int sum0;// char ch;while(1){sum0;//每一次输入结束后数的和重置int …

GDB的基本使用(1)

我有话说 因为时间和精力原因&#xff0c;本文写的虎头蛇尾了&#xff0c;除了启动调试与程序执行以外只有少量截图演示&#xff0c;只是简单的说明。如果有需要可以联系我&#xff0c;我有时间的话会把演示补上&#xff0c;谢谢理解。 启动调试与程序执行 启动调试并传递参数…

dubbo:dubbo+zookeeper整合nginx实现网关(四)

文章目录 0. 引言1. nginx简介2. 集成nginx2.1 负载均衡实现 3. 源码4. 总结 0. 引言 我们之前讲解过dubbozookeeper实现服务调用和注册中心&#xff0c;但是还缺乏一个统一的入口&#xff0c;即网关服务。dubbozookeeper的模式更加适合的网关组件为nginx&#xff0c;所以今天…

SQLserver中的触发器和存储过程

在 SQL Server 中&#xff0c;触发器是一种特殊的存储过程&#xff0c;它在指定的数据库表上发生特定的数据修改事件时自动执行。触发器可以用于执行各种任务&#xff0c;如数据验证、数据审计、自动更新相关表等。 触发器的类型 SQL Server 支持以下几种类型的触发器&#x…

如何使用ssm实现开放式教学评价管理系统+vue

TOC ssm121开放式教学评价管理系统vue 第1章 绪论 1.1 背景及意义 系统管理也都将通过计算机进行整体智能化操作&#xff0c;对于开放式教学评价管理系统所牵扯的管理及数据保存都是非常多的&#xff0c;例如个人中心、教师管理、学生管理、游客管理、评价信息管理、综合评…

XSS- - - DOM 破坏案例与靶场

目录 链接靶场&#xff1a; 第一关 Ma Spaghet 第二关 Jefff 第三关 Ugandan Knuckles 第四关 Ricardo Milos 第五关 Ah Thats Hawt 第六关 Ligma 第七关 Mafia 第八关 Ok, Boomer 链接靶场&#xff1a; XS…

在DDD中应用模式

深层模型和柔性设计并非唾手可得。要想取得进展&#xff0c;必须学习大量领域知识并进行充分的讨论&#xff0c;还需要经历大量的尝试和失败。但有时我们也能从中获得一些优势。一位经验丰富的开发人员在研究领域问题时&#xff0c;如果发现了他所熟悉的某种职责或某个关系网&a…

[数据集][目标检测]电力场景输电线杆塔塔架金属锈蚀腐蚀生锈检测数据集VOC+YOLO格式1344张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1344 标注数量(xml文件个数)&#xff1a;1344 标注数量(txt文件个数)&#xff1a;1344 标注…

makefile编译

文章目录 一、g和gcc的区别二、Linux下静态库和动态库三、makefile文件如何去编写 一、g和gcc的区别 基本定义&#xff08;参考AI让生活更美好&#xff09; gcc&#xff08;GNU Compiler Collection&#xff09;是一个编译器集合&#xff0c;最初是为C语言设计的&#xff0c;但…

fl studio mobile2024最新官方版V4.6.8安卓版+iOS苹果版

fl studio mobile&#xff0c;一款非常好用的音乐制作软件。该软件具有丰富多样的音乐类型让大家选择&#xff0c;内置多个好用的编辑工具、渲染工具、特效工具等可以使用。用户可以自由使用软件中的任何道具&#xff0c;直接在手机上编曲&#xff0c;进行音乐创作&#xff0c;…

iOS工程:获取手机相册权限,iOS原生系统弹窗, Privacy隐私政策选择,如何添加系统弹出并修改描述文字

【iOS工程】获取手机相册权限&#xff0c;iOS原生系统弹窗, Privacy隐私政策选择&#xff0c;如何添加系统弹出并修改描述文字 设备/引擎&#xff1a;Mac&#xff08;11.6&#xff09;/Mac Mini 开发工具&#xff1a;Xcode&#xff08;15.0.1&#xff09; 开发需求&#xff…

【Gaussian splatting系列学习】(三)

3DGS系列&#xff08;一&#xff09; 3DGS系列&#xff08;二&#xff09; 3DGS系列&#xff08;三&#xff09; 3D高斯球的颜色 基函数&#xff1a; 任何一个周期性函数可以分解为正弦和余弦的线性组合 球谐函数&#xff1a; 任何一个球面坐标的函数可以用多个球谐函数来近…

游戏引擎详解——图片

图片 图片的格式 图片文件格式pngjpg 纹理压缩格式ETC1/2PVRTCASTC 图片的属性 图片属性解释分辨率宽高像素值&#xff08;pt&#xff09;&#xff0c;如&#xff1a;1024*1024位深度用来存储像素颜色的值&#xff0c;如RGBA8888&#xff0c;红黄蓝透明度4个维度每个8bit&…

CentOS Docker搭建Mysql5.7集群

MySQL Replication MySQL提供了Replication功能&#xff0c;可以实现将一个数据库的数据同步到多台其他数据库。前者通常称之为主库&#xff08;master&#xff09;&#xff0c;后者则被称从库&#xff08;slave&#xff09;。MySQL复制过程采用异步方式&#xff0c;但延时非常…

初始redis:Zset有序集合

Set作为集合&#xff0c;有两个特点&#xff1a;唯一且无序。 Zset是有序集合&#xff0c;在保证唯一的情况下&#xff0c;是根据什么来排序的呢&#xff1f;排序的规则是什么&#xff1f; Zset中的member引入了一个属性&#xff0c;分数&#xff08;score&#xff09;&#…

立式报工台助力MES系统打造智能硬件解决方案

信息化与自动化的深度结合&#xff0c;使得企业在生产效率、质量控制以及资源管理等方面得以大幅提升。制造执行系统MES作为连接企业管理层与生产现场的重要桥梁&#xff0c;正在愈发得到重视。为了进一步强化MES系统的功能与应用&#xff0c;立式报工台作为一种新兴的智能硬件…

适用于 Windows 10 的最佳数据恢复免费软件是什么?

有没有适用于 Windows 10 的真正数据恢复免费软件&#xff1f;这篇文章将讨论这个话题&#xff0c;并分享什么是适用于 Windows 10/11/8.1/8/7/Vista/XP 的最佳数据恢复工具。 有没有适用于 Windows 10 的真正免费的数据恢复软件&#xff1f; 丢失重要数据&#xff0c;无论是由…

RISC-V vector(1) --- vector的引入与register说明

Vector相较于SIMD的优势 这两种实现方案&#xff0c;都是为了实现数据级并行性&#xff08;存在大量的数据可供程序同时计算&#xff09;&#xff1b; SIMD&#xff08;Single Instruction Multiple Data&#xff09; SIMD是将数据宽度和操作类型&#xff0c;都放在了指令中&a…

一道xss题目--intigriti-0422-XSS-Challenge-Write-up

目录 进入挑战 js代码 代码分析 构造payload ​编辑 结果 进入挑战 Intigriti April Challenge题目地址 打开题目后&#xff0c;找到对应页面的js代码&#xff0c;寻找一下我们用户可控的点 js代码 <!DOCTYPE html> <html lang"en"><head> …