全球旧事资料 分类
跳转指令进入C的主入口Mai
控制权从此移交给了C应用程序。
3
存储管理
存储管理是一个复杂的课题。从广义的角度来说磁盘文件系统、内存、片内高速Cache等都属于这个范畴。嵌入式系统中较有意义的是内存的动态分配与释放及Flash存储器管理两方面。本文要介绍的是我们在嵌入式系统中实现的动态内存管理。
C语言中动态内存分配与释放主要由malloc和free两个标
准库函数实现。malloc从系统空闲内存中分配合适的内存块
free函数完成内存块的回收。这两个函数一般需要操作系统内
核的支持在ARM裸平台上不能直接调用。为此我们编写了malloc和mfree两个函数实现动态存储管理的功能。典型应用程序内存映象分成代码区、数据区和栈区三个区从低地址到高地址依次分布。代码区从最低地址开始栈区
15
19952004Tsi
ghuaTo
gfa
gOpticalDiscCoLtdAllrightsreserved则占据最高地址。代码区和数据区可以相连也可以分开。嵌入式系统里代码区位于只读存储器如Flash中数据区和栈区则位于RAM中因此代码区和数据区一般并不相连1。数据区和栈区是分开的它们之间的空隙称作堆。堆作为一个连续的可利用空间是系统的初始可分配块。每次应用程序申请内存malloc便从堆中分割出一块从低地址开始给它。随着申请次数的增加原来一个完整的内存块便被分割为多个独立的块分配给应用程序。由于内存释放的先后顺序是随机的因此一定时间后系统中将存在多个互不相连的内存块。这就使得整个内存区呈现出占用块和空闲块犬牙交错的状态如图1所示。图中灰色部分表示内存被占用白色部分表示未被占用。
图1动态存储管理过程中的内存状态
为了进行内存动态管理需要维护两张全局表一张是可利用空间表availlist管理空闲内存块的信息另一张是已分配空间表usedlist管理占用内存块。这两张表都用双向循环链表实现。随着系统的运行可利用空间表中往往会有多个空闲块存在究竟分配哪一块呢文1介绍了三种不同的分配策略即首次拟合法、最佳拟合法和最差拟合法各有优缺点。笔者实现的是首次拟合法。可利用空间表和已分配空间表采用相同的“表元”数据结构定义如下
structmblock
fstructmblock3
extstructmblock3prevsizetsizechar3space
在系统初始化时整个可分配内存块是一个连续的存储区可利用空间表的元素只有一个。malloc函数每次分配内存时先检查sizemalloc的参数是否合法如是否超出堆的范围若合法再将其与32bit字对齐然后从availlist中搜索合适的内存块并将其分配给r
好听全球资料 返回顶部