嵌入式裸机内存动态管理的实现与讲解(一)

本文探讨了在嵌入式系统中自实现内存动态管理的必要性,以减少标准库函数的体积。文章介绍了内存碎片的概念,并指出标准C库的`malloc`和`free`不支持碎片回收。提出了一种支持内存碎片回收的算法,通过合并相邻空闲内存块来管理内存池。算法基于单向链表,首次申请内存时将全局静态数组分割,后续申请和释放过程中不断调整链表结构。代码实现部分将在后续更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • C 的标准库自带了mallocfree,为啥还要自己实现?标准库的函数占用空间较大,采用本文的实现可节约几KB的存储空间;
  • 为啥说裸机呢?因为带系统的软件系统一般都会带内存的动态管理函数供使用;
  • 内存碎片是什么? 首先明确一点,申请内存时会返回一个首地址,从首地址往后的 size 大小的空间都可用,这就说明 malloc必须返回一段连续的内存地址;有些内存动态管理算法是不支持碎片回收的,总是以新地址开始申请。
  • 已验证,标准 C 库的mallocfree的函数不支持内存碎片回收;测试方法:循环多次申请->释放较小的内存块,然后再申请大的内存块将失败。
  • 本文说明的算法是支持内存碎片化回收的,采用把相邻的空闲内存块进行合并的方法。

算法原理

数组我们比较熟悉,定义的数组必须实现固定大小,但实际编程中,有太多的情况我们事先无法预测这个数组该定义多大;没有内存动态管理的裸机系统的做法就是定义一个尽可能大的数组,浪费了RAM,也存在数组溢出的风险。

内存的动态管理:定义一个全局的静态大数组,先占个内存的坑,别让编译器给释放或优化掉了;这就是属于用户的内存池,进行自我的内存管理;

这个大的内存池怎么管理比较好呢?本文采用单向链表的形式进行管理,如下图;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值