42、【OS】【Nuttx】【OSTest】内存监控:堆空间初始化

server/2025/3/17 9:32:58/

背景

接上篇blog
41、【OS】【Nuttx】【OSTest】内存监控:堆空间申请
分析了堆空间的申请,下面分析堆管理器如何初始化申请后的堆空间

用户堆空间初始化

回到 umm_initialize 函数,之前 blog 40、【OS】【Nuttx】【OSTest】内存监控:用户堆内存函数 介绍过其相关一些概念
在这里插入图片描述
mm_initialize_pool 只看 mm_initialize 即可,因为 这里 init 指针传的空指针
在这里插入图片描述
根据申请的内存区域初始化堆结构
在这里插入图片描述
堆结构如下所示,主要由3部分组成:堆管理器(mm_heap_s 类型),守卫节点(mm_heapstart,mm_heapend),实际分配节点(mm_allocnode_s 类型)
在这里插入图片描述

mm_heap_s

堆管理器的头部信息如下
在这里插入图片描述

  • mm_lock:互斥锁,用来控制对堆的访问,确保在多线程环境下堆的操作是线程安全的
  • mm_heapsize:堆的总大小,记录堆的最大容量
  • mm_maxused:曾经使用过的最大内存,帮助了解堆的峰值情况
  • mm_curused:已使用内存,反映了当前时刻堆的实际占用情况
  • mm_heapstart:守卫节点,防止堆溢出,指向第一个节点,标志堆开始
  • mm_heapend:守卫节点,防止堆溢出,指向最后一个节点,标志堆结束
  • mm_nodelist:当前未被使用的内存块,数组中的元素提供了不同的入口点,以加速查找空闲内存块的过程,注意,这里 MM_NNODES 表示的是不同大小类别的数量,维护的是不同尺寸内存块类型的总数,不是空闲节点总数
  • mm_delaylist:延迟释放列表,由于某些原因不能立即释放内存的节点会被暂时存储在该列表中
    mm_nodelist 维护内存块如下图所示
    在这里插入图片描述

如图,mm_initialize 主要为 mm_heap_s 上下文初始化,比较简单,下面主要来分看看 mm_addregion
在这里插入图片描述

mm_addregion

如定义描述,region 是堆里面的连续的内存区域,由守卫节点和实际分配节点组成,在某些场景下,一个堆里面可以有多个 region,这里只分析对应一个 region 的情况
在这里插入图片描述
在这里插入图片描述
这里面比较有意思的一点,在这里 heapbase 对齐的时候额外加了俩节点的空间
在这里插入图片描述
改动可以追溯到2022年8月份的提交
在这里插入图片描述
可以看到在2022年前,这里还只是对 heapstart 对齐,并没有额外俩节点的操作,如果这里注释没看懂,继续往前追溯
在这里插入图片描述
在早些时间 2022 年5月,有过一次提交,但后面回退了,并有了 8 月份那次提交
在这里插入图片描述
可以看出,5月份的提交想对 heapbase 做好字节对齐
在嵌入式系统中,字节对齐是非常重要的概念,涉及到数据结构如何在内存中布局以及处理器如何访问这些数据:

  • 当数据按照总线宽度进行对齐时,处理器可以更高效地进行读写操作。比如对于一个32位的整数,在32位系统上对其存储意味着它的起始地址是4的倍数。这样,处理器可以在一次总线处理中完成对该整数的读写操作。如果不按对齐方式存储,可能需要两次或更多次的总线处理来完成同样的操作,降低效率
  • 某些 ARM 处理器要求32位数据的起始地址必须是4的倍数。如果数据没有正确对齐,会触发硬件异常,如 HardFault
    在这里插入图片描述
    这里 SIZEOF_MM_ALLOCNODE 为 mm_allocnode_s 的数据类型大小,从其定义可以看出这里实现了字节对齐。但为了实现 MM_MIN_CHUNK 对齐,可以看到 W 兄尝试将 SIZEOF_MM_ALLOCNODE 替换成 MM_MIN_CHUNK
    在这里插入图片描述
    但这样不是最佳的办法,因为首先 MM_MIN_CHUNK 是需要对齐最小的 2 的幂,假设 mm_allocnode_s 数据类型的大小为 257 字节,那么就需要对齐到 512 字节,这里面有最大 49% 的字节是浪费掉去做对齐的
    在这里插入图片描述
    而且,这样做只能对齐到 heapstart,无法覆盖到给用户分配数据的区域,此时用户拿到的数据仍可能是非字节对齐的,如下所示
    在这里插入图片描述

为了解决该问题,8月份该 MR被回退了,并提供了新的解决方案,此时也不再使用 MM_MIN_CHUNK 进行字节对齐,并将MM字节对齐的区域覆盖到分配给用户的地址,相较之前确实是个 better solution,不过这里描述有点问题,不是进行的 MM_MIN_CHUNK 对齐,而是 MM_ALIGN_UP 对齐
在这里插入图片描述

改动也可以看出这里非 MM_MIN_CHUNK 对齐,而是 MM_ALIGN_UP,这样不会浪费空间

在这里插入图片描述
示意图如下
在这里插入图片描述

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

相关文章

蓝桥杯15届省C

洛谷P10904挖矿 #include<bits/stdc.h> using namespace std; int n, m; const int N 2000010; int l[N], r[N]; int cnt; int main(){cin >> n >> m;for(int i 1; i < n; i){int x; cin >> x;if(x > 0){r[x];}else if(x < 0){l[-x];}else…

[WEB开发] Web基础

一. HTTP 在之前的文章中, 我们已经详细学习过HTTP了. [计算机网络] HTTP/HTTPS 二. Web基础 2.1 spring全家桶 spring framework: spring最底层的框架. Spring Framework 是一个功能强大的 Java 应用程序框架&#xff0c;旨在提供高效且可扩展的开发环境。它结合了轻量级…

ISP--Gamma Correction

文章目录 现象Gamma产生的原因CRT属性导致人眼的亮度特性 gamma校正LUT法线性插值法模拟gamma法 现象 从上往下看左侧黑色块黑得越来越严重&#xff0c;对比度也在逐渐加深。此时灰阶的高亮区获得的数据位变少&#xff0c;暗区获得的数据位变多&#xff0c;暗区细节会更多。但是…

Authenticity is the compass that guides you to your true purpose

Title: The Strength of Being Unapologetically You In a world that constantly pressures us to conform, authenticity becomes an act of rebellion. Your uniqueness is not a flaw—it is your superpower. When you silence the noise of others’ expectations and li…

Vue-Lottie动画使用

Vue-Lottie 是一个基于 Vue.js 的库&#xff0c;用于在 Vue 应用程序中渲染 Adobe After Effects 动画&#xff0c;通过 Bodymovin 插件导出的 JSON 数据来实现。这个项目非常适合那些想要在他们的Vue项目中加入精美动画而又不希望因为视频文件或 GIF 图片而增加应用大小的开发…

信息系统运行管理员教程6--信息系统安全

信息系统运行管理员教程6–信息系统安全 第1节 信息系统安全概述 1.信息系统安全的概念 信息系统安全是指保障计算机及其相关设备、设施&#xff08;含网络&#xff09;的安全&#xff0c;运行环境的安全&#xff0c;信息的安全&#xff0c;实现信息系统的正常运行。信息系统…

es6初步学习

Es6 作用&#xff1a; 语法简洁&#xff0c;功能丰富框架开发应用前端开发职位要求 ECMAScript 它是一个脚本程序设计语言注意&#xff1a;块级作用域是指变量只在特定的代码块&#xff08;通常由一对花括号{}包裹&#xff0c;比如if语句、for循环、while循环等的代码块 &a…

国产编辑器EverEdit - Hex Dump插件:看到文本的另一面!

1 Hex Dump插件 1.1 应用场景 有时可能需要显示字母的ASCII编码&#xff0c;或其他文字的字节编码&#xff0c;可以使用Hex Dump插件来完成 1.2 使用方法 安装Hex Dump插件&#xff0c;安装插件方法参考&#xff1a;扩展管理 在编辑器中选中文本&#xff0c;选择扩展 -> …