侵权投诉

动态内存管理模块的设计原理与实现

电子设计 2020-06-30 08:05 次阅读

引言

当前,绝大多数嵌入式平台上的软件都采用C语言编写。除了代码简洁、运行高效之外,灵活操作内存的能力更是C语言的重要特色。然而,不恰当的内存操作通常也是错误的根源之一。如“内存泄漏” ――不能正确地释放已分配的动态内存,就是一种非常难于检测的存错误。持续的内存泄漏会使程序性能下降到最终完全不能运行,进而影响到所有其它有动态内存需求的程序,在某些相对简单的嵌入式平台上甚至会妨碍操作系统的运转。再如“写内存越界”,一种不合法的写内存操作,极可能破坏到本程序中正在使用的其它数据,严重的时候还可能对其它正在运行的程序甚至整个系统造成影响。为此,本文介绍一个增强的、可定制的动态内存管理模块(以下不妨简称Fense),在 C语言提供的内存分配函数基础上,增加了对动态内存的管理功能;能记录软件运行过程中出现的内存泄漏信息,同时也具一定的监测内存操作的能力;可以发现绝大多数对动态内存的写越界错误。

1、Fense的设计原理

Fense 通过设立一个双向链表(struct Head *stHead)来保存所有被分配的动态内存块的信息。链表中的每个节点对应一个动态内存块,节点中包括此内存大小、分配发生时所在的源文件名和行号以及被释放的时候,Fense又从st_Head中删除之,检查st_Head中的节点即可得到未被释放的本节点的数值校验和等。Fense将每一个分配的动态内存块插入到链表st_Head中;当此内存放内存块信息。链表节点结构定义如下:

struct Head{

char file; /分配所在源文件名*/

unsigned long line; /*分配所在的行号*/

size_t size; /*分配的内存大小*/

int checksum; /*链表节点校验和*/

struct Head prev,next; /*双链表的前后节点指针*/

};

/*全局的双向链表*/

struct Head *st_Head=NULL;

为了检测写越界的错误,Fense在用户申请的内存前后各增加了一定大小的内存作为监测区域,并初始化成预定值。这样,当程序发生越界写操作时,预定值就会发生改变,Fense即可检测到错误。

通过Fense分配到的动态内存结构如图1所示。由此可知,Fense_Malloc(Fense的内存分配函数)返回给用户的指针ptr指向的是用户申请内存区域的起始位置。链表节点、前/后监测区域均为Fense内部使用,是用户不可见的。

动态内存管理模块的设计原理与实现

2、 用户定制选项

Fense有5组宏定义提供给用户对功能进行定制。各组选项控制意义如下:

WARN_ON_ZERO_MALLOC 用户申请零分配空间时警告信息。

FILL_ON_MALLOC 分配时初始化内存块

FILL_ON_MALLOC_VAL 分配初始化时的预设值

FILL_ON_FREE 释放时填充内存块

FILL_ON_FREE_VAL 释放时填充内存块的预设值

以上4个选项的主要功能是初始化刚分配到的内存和刚被释放的内存为预设值,尽可能地避免出现因使用未初始经的内存而引发的错误。

FENSE_FRONT_SIZE 定义前监测区域大小

FENSE_FRONT_VAL 定义前监测区域的预设值

FENSE_END_SIZE 定义后监测区域大小

FENSE_END_VAL 定义后监测工域的预设值

在Fense 工作过程中,对内存越界写操作的检验是通过比较监测区域的当前值与本监测区域的预设值来确定的。显然不能排除这样一种可能:即发生在监测区域的越界写操作写入的数值与监测区域的预设值恰好相同,此时,Fense无法发现错误的发生。对于这种情况,用户可以通过更改监测区域预设值(FENSE_FRONT_VAL和FENSE_END_VAL)和监测区域大小(FENSE_FRONT_SIZE和FENSE_END_SIZE)为多组不同的值来反复测试,这样就可以大幅度地提高监测的准确性。

VALIDATE_FREE

free是检查本内存块是否在链表中

CHECK_ALL_MEMORY_ON_FREE

free时检查链表中的所有内存块

由于存在这样一种情况:对内存块A的写操作出现了越界错误,写到了另一内存块B的区域内。此时,仅仅检查内存块A的有效性就无法发现问题,如果同时检查所有的动态内存块,则有可能发现错误所在。以上选项即为此而设。

FENSE_LOCK 获取对链表st_Head的操作权

FENSE_UNLOCK 释放对链表st_Head的操作权

考虑到的在多线程环境中,可能有多个线程同时用Fense进行内存管理,而Fense使用的链表st_Head是全局变量,因此提供了以上2个宏来实现对 st_Head的互斥访问。宏的具体定义依赖于用户所在的软件环境,用户可自行实现。对于单线程系统,仅需将这2个宏定义为空即可。

为便于使用,Fense的头文件中还包括了以下定义,使得用户基本不用改动现有的源代码就可引入Fense。

#define malloc(size) Fense_Malloc(size,_FILE_,_LINE_)

#define free(ptr) Fense_Free(ptr,_FILE_,_LINE_)

#define realloc(ptr,new_size) Fense_Realloc(ptr,new_size,_FILE_,_LINE_)

#define colloc(num,size) Fense_Calloc(num,size,_FILE_,_LINE_)

3、 运行时控制

Fense 监测内存的功能可以在运行动态地开关。此功能通过将全局变量st_Disbaled赋值为零或非零来实现。在调试过程中,可以在调试器中即时修改 st_Disabled的值来控制Fense的行为,省去了重编译源代码的需要。对于那些需要大量编译时间的大型工程或交叉平台开发的软件项目来说,这是非常有利的。

4、 Fense的具体实现

Fense 提供Fense_Malloc、Fense_Free、Fense_Realloc及Fense_Calloc等内存管理函数,功能和调用形式与C语言中的malloc、free、realloc和calloc保持一致。限于篇幅,这里仅对Fense_Malloc和Fense_Free的实现过程做一个简单描述,具体实现请见本刊网络补充版。http://www.dpj.com.cn

/*内存分配函数*/

void *Fense_Malloc(size_t size,char *file,unsigned long line)

{

//检查Fense的运行时开关,如果Fense被关闭,则调用malloc

//分配并返回

//检查是否零分配,如有则提示警告信息后返回0(用户定制选项)

//分配内存,包括链表节点区域和前/后监测区域

//初始化链表节点,保存分配内存的信息,包括分配的大小、所在文件名和行号

//将此节点插入链表st_Head

//为本节点区域计算校验和

//用预设值初始化前/后监测区域

//用预设值填充用户内存区域(用户定制选项)

//返回用户内存区域的起始位置

}

/*内存释放函数*/

void Fense_Free(void *uptr,char *file,unsigned long line)

{

//检查Fense的运行时开关,如果Fense初关闭,则调用free释译并返回

//检查所有Fense管理下的动态内存(用户定制选项)

//判断当前内存块是否在链表st_Head中,如果不在则提示

//警靠信息,退出(用户定制选项)

//检查当前内存块是否存在越界操作

//将当前内存块的相应的链表节点从st_Head中删除

//重新计算当前节点的前后相邻节点的校验和

//用预设值填充被释放的内存区(用户定制选项)

//调用free释放当前的内存块

}

(文中代码在Visual C++++6.0、Borland C++ 3.1及CrossCode C 7.4环境中编译通过)

5、结束语

作为对C程序运行时的内存错误进行监测的代码模块,Fense能发现几乎所有的内存泄漏和绝大多数的越界操作,并尽可能地记录了改正程序错误所需要的信息;有效地减少了程序设计人员的调试时间,在实际嵌入式产品开发中取得了很好的效果。

责任编辑:gt


收藏 人收藏
分享:

评论

相关推荐

嵌入式Linux系统篇:RealARM2410技术手册

  RealARM2410是基于三星公司S3C2410X 高性能ARM 处理器的嵌入开发平台,旨在为....
发表于 07-07 16:35 11次 阅读
嵌入式Linux系统篇:RealARM2410技术手册

简易嵌入式计算器的设计方案

  随着电子科技技术的不断发展在当今社会计算器已深入人们生活中给人们的生活带来了方便推动了社会的发展....
发表于 07-07 16:25 21次 阅读
简易嵌入式计算器的设计方案

I.MX6ULL终结者开发板裸机仿真jlink调试

I.MX6ULL‘终结者’开发板预留了JTAG仿真接口,并给出了开发文档,可以实现在JLINK仿真器条件下的单步跟踪、断点...
发表于 07-07 10:56 92次 阅读
I.MX6ULL终结者开发板裸机仿真jlink调试

智能安防:网络视频存储服务器的重要性

网络视频存储服务器是一种用于视频和音频数据压缩、存储和处理的嵌入式设备。它广泛应用于远程监控和bbb....
的头像 如意 发表于 07-07 10:40 67次 阅读
智能安防:网络视频存储服务器的重要性

香橙派OrangePi 3 开发板在Linux系统下如何使用蓝牙

这款开发板体积小,却集成了丰富的接口,板载wifi+蓝牙,拥有mini PCIE接口,千兆网口,MIC音频输入口,HDMI2.0a和3.5...
发表于 07-06 17:19 377次 阅读
香橙派OrangePi 3 开发板在Linux系统下如何使用蓝牙

双端口SRAM如何提高系统的整体性能

SRAM 以其高速、静态的优点广泛应用于各种数字设备中,多被用作不同部件之间的缓冲,尤其在计算机体系架构中扮演着重要的角色...
发表于 07-06 16:26 487次 阅读
双端口SRAM如何提高系统的整体性能

4G内存和6G内存的手机成本差异是多少?

现在手机4G内存和6G内存的成本差异大概有多少呢?实际上,现在大多数的手机厂商还是使用LPDDR4X....
的头像 如意 发表于 07-05 10:38 224次 阅读
4G内存和6G内存的手机成本差异是多少?

工控机由哪几部分组成

那我们的工控机的是怎样做的呢?我们的工控机是由哪几方面组成的,下面给大家讲解一下:
发表于 07-05 09:30 53次 阅读
工控机由哪几部分组成

Linux主要应用在那些领域

日前,国际超算大会发布了最新的全球TOP500超级计算机列表,其中最著名的是日本超级计算机“ Fug....
的头像 Wildesbeast 发表于 07-04 11:38 342次 阅读
Linux主要应用在那些领域

Apple宣布采用全新设计的macOS Big Sur

苹果还进行了其他一些调整。菜单栏现在变得更高且更透明,界面的字体颜色根据桌面背景的颜色而变化,下拉菜....
的头像 倩倩 发表于 07-03 17:03 304次 阅读
Apple宣布采用全新设计的macOS Big Sur

华为云全球首发容器安全服务,市场份额位居国内厂商第一

近日,国际权威咨询机构IDC发布了《PRC SDC Software Market Overview....
的头像 牵手一起梦 发表于 07-03 16:34 215次 阅读
华为云全球首发容器安全服务,市场份额位居国内厂商第一

iOS 14的隐私功能显示了复制到剪贴板的TikTok阅读文本

开发人员开始下载并使用iOS 14 beta版,他们发现流行的视频共享平台TikTok是读取用户复制....
的头像 倩倩 发表于 07-03 16:33 333次 阅读
iOS 14的隐私功能显示了复制到剪贴板的TikTok阅读文本

什么是嵌入式与物联网,物联网与嵌入式之间的关系

互联网着重信息的互联互通和共享,解决的是人与人的信息沟通问题;物联网则是通过人与人、人与物、物与物的....
发表于 07-03 14:23 80次 阅读
什么是嵌入式与物联网,物联网与嵌入式之间的关系

非易失性MRAM读写操作

高密度MRAM具有非常低的功率,高的读取速度,非常高的数据保留能力和耐久性,适用于广泛的应用。单元面积仅为0.0456平方微米...
发表于 07-02 16:33 1273次 阅读
非易失性MRAM读写操作

SECORA™ ID S:为各地电子身份证卡和电子政务带来高安全级别的灵活解决方案

搭配英飞凌的线圈模块封装技术,可以有效的提高证卡的耐久度,使其生产、签发、及使用的周期更具成本效益。
的头像 西西 发表于 07-02 16:14 158次 阅读
SECORA™ ID S:为各地电子身份证卡和电子政务带来高安全级别的灵活解决方案

嵌入式必看 Linux内存管理工作原理

机器的内存是有限资源,而进程数量是无法确定的,如果在某些时候已经启动的进程占据了所有内存空间,此时就....
发表于 07-02 15:10 171次 阅读
嵌入式必看 Linux内存管理工作原理

Linux下对于函数调用的工作原理

高地址的一部分空间会分配给内核,称为内核空间,剩下的内存空间给用户使用,称为用户空间。
发表于 07-02 14:46 56次 阅读
Linux下对于函数调用的工作原理

CUDA 6中的统一内存模型

NVIDIA在CUDA 6中引入了统一内存模型 ( Unified Memory ),这是CUDA历....
的头像 Linuxer 发表于 07-02 14:08 96次 阅读
CUDA 6中的统一内存模型

苹果iOS系统迎来更新,最新加入三大功能

苹果推送了 iOS 13 的又一个公测版本,其版本号为 13.6,具体代号为 c17G5059,一同....
发表于 07-02 10:17 253次 阅读
苹果iOS系统迎来更新,最新加入三大功能

雷克沙进军内存市场,内存市场大风暴

雷克沙的笔记本和台式机内存条采用了黑色的 PCB。参数方面,笔记本和台式机内存条都是 DDR4 26....
发表于 07-02 09:42 59次 阅读
雷克沙进军内存市场,内存市场大风暴

曙光中标分布式块存储产品集采 中国移动给大订单

近年来,分布式存储技术在电信行业得到广泛的推广,在云化转型、 IoT、5G 等新兴业务,虚拟化资源池....
发表于 07-02 09:07 60次 阅读
曙光中标分布式块存储产品集采  中国移动给大订单

嵌入式ICE-RT逻辑和嵌入式跟踪宏核(ETMS)系列

ARM的Jazelle技术使Java加速得到比基于软件的Jaarm处理器阶梯图va虚拟机(JVM)高....
的头像 ARM视频 发表于 07-02 08:36 641次 观看
嵌入式ICE-RT逻辑和嵌入式跟踪宏核(ETMS)系列

如何使用UCOS操作系统实现万年历的设计

本文档的主要内容详细介绍的是如何使用UCOS-II操作系统实现万年历的设计。
发表于 07-02 08:00 28次 阅读
如何使用UCOS操作系统实现万年历的设计

国产操作系统产业深度解析

中国的操作系统国产化浪潮源于20世纪末,历经二十余年,厚积薄发、屡败屡战。目前,依托开源生态以及政策....
的头像 玩转单片机 发表于 07-01 17:10 1026次 阅读
国产操作系统产业深度解析

8位的MCU的情形又如何,很多嵌入式工程师都有一些误解

不少人会认为既然现在市场的宠儿是32位的MCU,厂商们是不是都没有投入研发资源在8位产品上了。这么想....
的头像 玩转单片机 发表于 07-01 16:58 242次 阅读
8位的MCU的情形又如何,很多嵌入式工程师都有一些误解

梳理嵌入式Linux的一些知识

学单片机的朋友有些已经有一些Linux基础了,但也不乏有些朋友没用过Linux,甚至有些初学的读者朋....
的头像 玩转单片机 发表于 07-01 16:56 432次 阅读
梳理嵌入式Linux的一些知识

Gigantic巨页与CMA的完全结合

用户可以在开机的时候通过hugetlb_cma bootargs来设置CMA的大小,如果是NUMA架....
的头像 Linuxer 发表于 07-01 14:46 110次 阅读
Gigantic巨页与CMA的完全结合

基于PSoC3可编程嵌入式片上系统的智能手机电池充电器

  PSoC®3是一款真正的可编程嵌入式片上系统,在单个芯片上集成了可配置的模拟和数字外设功能,存储....
的头像 Cypress视频 发表于 07-01 12:23 255次 观看
基于PSoC3可编程嵌入式片上系统的智能手机电池充电器

采用MPLAB代码配置器配置ADC及FVR

MPLAB 集成开发环境(IDE)是综合的编辑器、项目管理器和设计平台,适用于使用Microchip....
的头像 Microchip视频 发表于 07-01 10:08 482次 观看
采用MPLAB代码配置器配置ADC及FVR

CompactRIO系统拥有坚固的硬件架构

CompactRIO是美国国家仪器(NI)公司生产的一款可重新配置的嵌入式测控系统。CompactR....
的头像 NI视频 发表于 07-01 08:20 672次 观看
CompactRIO系统拥有坚固的硬件架构

KUKA.ProConOS软件功能简史

ProConOS是一款高性能PLC运行时间引擎,专为基于嵌入式和PC的控制应用而设计。ProConO....
的头像 机器人及PLC自动化应用 发表于 06-30 15:54 141次 阅读
KUKA.ProConOS软件功能简史

嵌入式设备如何提高安全性

  随着越来越多的嵌入式设备接入网络并成为物联网的一部分,网络黑客们开始利用这些连接,以达到自己不可告人的目的。因此,嵌...
发表于 06-30 11:05 1035次 阅读
嵌入式设备如何提高安全性

嵌入式神经网络有哪些挑战

  1、宽频限制以及嵌入式系统的计算能力   NN需要大量数据,利用DDR在各层之间进行传输。如为卷积和完全连接数据重量来...
发表于 06-30 11:01 922次 阅读
嵌入式神经网络有哪些挑战

华为强势出击!更新HMS系统,谷歌断供策略失败

只要华为跟美国的这一出“戏”还没落下帷幕,还是有不少人都会担忧华为的发展。华为是让我国人们很骄傲的存....
的头像 如意 发表于 06-30 08:44 558次 阅读
华为强势出击!更新HMS系统,谷歌断供策略失败

微控制器(MCU)由什么组成

微控制器(MCU)由中央处理器(CPU),非易失性存储器(ROM),易失性存储器(RAM),外围设备....
发表于 06-29 11:20 86次 阅读
微控制器(MCU)由什么组成

数据测试:网站测试清单

数据测试:网站测试清单
的头像 如意 发表于 06-29 10:25 260次 阅读
数据测试:网站测试清单

选择单片机(MCU)考虑的九大因素

单片机(MCU)是一个小型的计算机,它将各个部件集成在单个芯片上,具有CPU,内存(RAM和ROM)....
发表于 06-29 09:53 78次 阅读
选择单片机(MCU)考虑的九大因素

Socket编程的目的就是如何实现这两端之间的通信

Socket编程不仅仅在互联网方面很重要,在我们的嵌入式方面也是非常的重要,因为现在很多电子设备都趋....
的头像 玩转单片机 发表于 06-28 17:15 470次 阅读
Socket编程的目的就是如何实现这两端之间的通信

嵌入式系统节省内存的解决方法

嵌入式系统内存往往是有限制的(成本考虑),因此需要尽量支持更多的功能,同时尽量减少使用的内存。
的头像 如意 发表于 06-28 11:57 482次 阅读
嵌入式系统节省内存的解决方法

纯软件和嵌入式软件区别

  纯软件和嵌入式软件区别为:   1、定义不同   ①嵌入式软件就是嵌入在硬件中的操作系统和开发工具软件,包括软件部分和...
发表于 06-28 11:36 81次 阅读
纯软件和嵌入式软件区别

香橙派全志H6开发板Orange Pi 3在安卓系统下的蓝牙使用方法

香橙派Orange Pi 3 是一款开源的单板电脑,可以运行Android7.0、Ubuntu、Debian等操作系统。使用全志H6系统级芯片,同时拥...
发表于 06-28 11:34 1748次 阅读
香橙派全志H6开发板Orange Pi 3在安卓系统下的蓝牙使用方法

嵌入式软件开发是做什么的

  嵌入式软件开发是做什么的   嵌入式软件开发做什么,首先你要知道对于嵌入式软件开发工程师来说大概是做什么的,负责上层...
发表于 06-28 11:31 90次 阅读
嵌入式软件开发是做什么的

9个思维导图

关于操作系统,问的其实不是特别多,问来问去基本都是那几个问题,例如进程通信,线程与进程区别,进程调度....
的头像 算法与数据结构 发表于 06-28 11:24 316次 阅读
9个思维导图

什么叫嵌入式

  嵌入式即嵌入式系统,IEEE(美国电气和电子工程师协会)对其定义是用于控制、监视或者辅助操作机器和设备的装置,是一种...
发表于 06-28 11:23 84次 阅读
什么叫嵌入式

整合Xilinx PetaLinux工程编译和Open Source U- Boot/Linux编译

PetaLinux/Yocto的编译流程,也和很多开发人员原来的基于make的工作方法不一样,它会分....
的头像 FPGA开发圈 发表于 06-28 10:50 340次 阅读
整合Xilinx PetaLinux工程编译和Open Source U- Boot/Linux编译

了解嵌入式AI计算功能的智能监控摄像头

ABI Research的最新《智慧城市市场数据》报告显示,预计到2026年,智能公用事业计量(电力....
的头像 视频监控安防D1net 发表于 06-28 09:03 290次 阅读
了解嵌入式AI计算功能的智能监控摄像头

SmartX对SMTX OS软件进行全方面优化,将引领下一阶段超融合创新

目前,Sailfish 项目中使用到的技术已经集成到了最新的SmartX Halo P 系列一体机中....
的头像 我快闭嘴 发表于 06-24 19:11 651次 阅读
SmartX对SMTX OS软件进行全方面优化,将引领下一阶段超融合创新

在C语言中,全局变量滥用的后果是什么

01 啥是全局变量 说起全局变量,就不得不提到全局变量,局部变量,静态全局变量,静态局部变量,这些都....
发表于 06-24 17:14 74次 阅读
在C语言中,全局变量滥用的后果是什么

莫仕的Twinax“嵌入式”解决方案

使用twinax解决方案还可以缩短上市时间,从而避免了工程师花费数月时间来优化每个通道。
发表于 06-24 16:50 184次 阅读
莫仕的Twinax“嵌入式”解决方案

Cortex-M3是一款ARM处理器内核

Cortex-M3:是一款ARM处理器内核,也可以理解为ARM处理器家族之中的一个成员。ARM处理器....
的头像 玩转单片机 发表于 06-24 14:44 360次 阅读
Cortex-M3是一款ARM处理器内核

传感器测量怎么做才能稳定呢?

今天遇到一个网友问一个问题,他有一个传感器测量一个物理量,需要判断其变化趋势,我给了一些建议,这里将....
的头像 玩转单片机 发表于 06-24 11:37 961次 阅读
传感器测量怎么做才能稳定呢?

购买内存前必须了解的内存升级知识

年初的时候,上游厂商预测今年受5G爆发、智能手机回暖、数据中心需求高涨以及疫情等因素的影响,2020....
的头像 如意 发表于 06-24 09:34 347次 阅读
购买内存前必须了解的内存升级知识

内外兼修,江波龙DDR4内存已通过KTI专项测试认证

继推出全系列容量的DDR4内存和基于长鑫存储DRAM资源的国产化内存后,江波龙在内存测试技术上不断探....
发表于 06-23 15:44 188次 阅读
内外兼修,江波龙DDR4内存已通过KTI专项测试认证

c语言入门:c语言的具体结构

变量就是可以变化的量,而每个变量都会有一个名字(标识符)。变量占据内存中一定的存储单元。使用变量之前....
的头像 玩转单片机 发表于 06-23 15:38 300次 阅读
c语言入门:c语言的具体结构

2020年软硬件有什么值得学习的新技术

一般的机器学习工程师很少考虑计算资源。而且他们也很少关心内存的使用情况。为什么?因为这些硬件都很便宜....
的头像 玩转单片机 发表于 06-23 15:30 650次 阅读
2020年软硬件有什么值得学习的新技术

虚拟机:linux高端内存管理之永久内核映射

与直接映射的物理内存末端、高端内存的始端所对应的线性地址存放在high_memory变量中,在x86....
的头像 如意 发表于 06-23 08:38 579次 阅读
虚拟机:linux高端内存管理之永久内核映射

单片机的四大功能

单片机经常使用在许多电子设备上,用来控制电子产品的一些动作和功能。英锐恩单片机开发工程师表示,因为这....
发表于 06-21 11:44 209次 阅读
单片机的四大功能

内存泄漏的特点和类型

在计算机科学中,内存泄漏(memory leak)指由于疏忽或错误使程序未能释放而造成不能再使用的内....
的头像 如意 发表于 06-20 10:58 199次 阅读
内存泄漏的特点和类型

一文分析Uboot启动流程

Uboot是嵌入式系统中最常用的bootloader,这里我们以s3c2410为例分析一下uboot....
的头像 如意 发表于 06-20 10:03 452次 阅读
一文分析Uboot启动流程
博评网