一种无mmu平台的应用系统内存管理的方法及系统的制作方法

文档序号:6610698阅读:253来源:国知局
专利名称:一种无mmu平台的应用系统内存管理的方法及系统的制作方法
技术领域
本发明属于内存管理领域,尤其涉及一种无MMU平台的应用系统内存管 理的方法及系统。
背景技术
针对有内存管理单元(Memory Management Unit, MMU)的处理器设计的一 些桌面操作系统,如Windows, Linux,使用了虛拟存储器的概念。虛拟内存地 址被送到MMU映射为物理地址,实际存储器被分割为相同大小的页面,采用 分页的方式载入进程。
但是有4艮多应用系统,例如嵌入式系统,是针对没有MMU的处理器开发 设计的,因此不能使用处理器的虛拟内存管理技术,它们对于内存的访问是直 接通过访问实际物理地址实现的。而JM艮多应用系统对内存空间没有保护,各 个进程实际上共享一个运行空间, 一个进程在执行前,系统必须为它分配足够 的连续地址空间,然后全部载入主存储器的连续空间。
由此可见,对于无MMU的应用系统的开发人员不得不参与系统的内存管 理。从编译内核开始,开发人员必须告诉系统这块开发板到底拥有多少内存, 在开发应用程序时,则必须考虑内存的分配情况并关注应用程序需要运行空间 的大小。此外,由于采用实存储器管理策略,用户程序同内核以及其他用户程 序在一个地址空间,程序开发时要保证不侵犯其它程序的地址空间,以使得程 序不至于破坏系统的'正常工作,或导致其他程序的运行异常。因此,对于无 MMU的应用系统的开发人员对软件中的一些内存操作要格外小心。
这样的应用系统对内存分配有很高的要求,主要体现在
1、内存能快速申请和释放,即快速性。系统对实时性的保证要求内存分配过程要尽可能地快;
2、 内存分配保持原子性,即可靠性。也就是内存分配的请求必须得到满足, 如果分配失败可能会带来灾难性的后果; -
3、 内存应该各尽其用,即高效性。内存分配要尽可能地少浪费。不可能为 了保证满足所有的内存分配请求而将内存配置得无限大。
通常情况下,开发人员对内存的请求和释放都是直接调用系统调用来实现。 例如在嵌入式系统ucLinux中,C库中malloc和free的实现是分別基于mmap 和munmap两个系统调用来实现的。但是,对内存的频繁的请求肯定带来系统 性能的损耗,同时也可能造成大量内存碎片的存在,从而导致无法预料的后果, 而且也难于对应用系统的内存使用情况做很好的监控和调整。
在现有的一些应用系统的内存管理方法中,有的采用预分配多个固定长度 内存块链表的方式,这种方式主要针对满足应用系统对小内存块的频繁需求, 而却忽视了对大内存块的管理,从而降低了应用系统对内存使用的整体效率, 无法很好地满足内存分配的可靠性和高效性,而且这种方式需要对应用程序的 内存使用预先做出正确的估计,对于比较大些的系统,这种方式的实现具有非 常大的难度;有的则直接采用链表的方式对内存块进行动态管理,这种方式将 内存块不分大小统一链接在一起,每次分配内存时则通过对链表进行查找足够 大的内存来实现,这种方式在具体实施时会由于应用系统对小块内存的频繁需 求而耗费大量的CPU时间去查找能满足请求的内存,从而无法满足内存分配的 快速性。
这些方式都没有对内存的使用进行系统而全面的管理,不但易造成内存资 源的浪费,也不能同时满足应用系统对内存分配的快速性、可靠性和高效性, 而且也无法很方便地实现对内存使用状况的统计,以及对内存泄漏和操作越界 现象的防范和控制
发明内容
本发明实施例的目的在于4是供一种无MMU平台的应用系统内存管理的方
法及系统,旨在解决现有针对无MMU的硬件平台的应用系统内存管理方法没 有对内存进行全面、系统的管理,且没有根据应用系统对内存使用的大小进行 分级处理,从而无法满足应用系统对内存使用的快速性、可靠性以及高效性的 问题。
本发明实施例是这样实现的, 一种无MMU平台的应用系统内存管理的方 法,所述方法包括
设置系统内存使用的阀值,对于大于阀值的大块内存建立内存管理模型 PMP进行管理,对于小于等于阀值的小块内存建立内存管理模型SMP进行管 理,所述内存管理模型PMP中建有双向链表FPL,管理PMP中所有大于阀值 的空闲内存块,所述内存管理模型SMP中建有链表数组,管理SMP中所有小 于等于阀值的空闲内存块;
接收系统请求分配内存的指令及参数,所述参数包括系统请求分配的内存 长度;
当请求分配的内存大于阀值时,则在PMP中查找匹配的内存块,并返回结 果给系统,释放系统使用完毕的内存块;
或当请求分配的内存小于等于阔值时,则在SMP中查找匹配的内存块,并 返回结果给系统,释放系统使用完毕的内存块。
本发明实施例的另 一 目的在于提供一种无MMU平台的应用系统内存管理 系统,所述系统包括
初始单元,用于建立对大于阀值的大块内存的操作进行管理的内存管理模 型PMP,以及建立对小于等于阀值的小块内存的操作进行管理的内存管理模型 SMP,所述内存管理模型PMP中包含双向链表FPL,管理PMP中所有大于阀 值的空闲内存块,所述内存管理模型SMP中包含链表数组,管理SMP中所有 小于等于阀值的空闲内存块,以及对系统进行初始化;
接口单元,用于接收应用系统对内存的操作指令及参数,以及将指令的执行结果返回给应用系统,所述操作指令包括系统请求分配内存的指令,所述参
数包括系统请求分配的内存大小;
大块内存操作管理单元,用于对应用系统请求分配或需要释放的内存大于
阀值时,在所述内存管理模型PMP中实现内存的分配或释放;以及
小块内存操作管理单元,用于对应用系统请求分配或需要释放的内存小于 等于阀值时,在所述内存管理模型SMP中实现内存的分配或释放。
本发明实施例通过设置内存使用的阀值,针对大于阀值的大内存块以及小 于等于阀值的小内存块的操作分别运用大内存块管理模型PMP和小内存块管 理模型SMP进行管理,并分别采用双向链表和链表数组对空闲大内存块以及空 闲小内存块进行管理,从而实现对应用系统内存使用的全面、系统的管理,既 能消除内存碎片的产生,避免内存资源的浪费,又能实现快速、可靠地分配内 存及释放。


图l是本发明实施例提供的大块内存的管理模型图; 图2是本发明实施例提供的小块内存的管理模型图3是本发明实施例提供的无MMU平台的应用系统内存管理方法的流程
图4是本发明实施例提供的分配大块内存的方法流程图; 图5是本发明实施例提供的释放大块内存的方法流程图; 图6是本发明实施例提供'的分配小块内存的方法流程图; 图7是本发明实施例提供的释放小块内存的方法流程图; 图8是本发明实施例提供的无MMU平台的应用系统内存管理系统的结构图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实 施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅 仅用以解释本发明,并不用于限定本发明。
本发明实施例通过设置系统内存使用的阀值,针对大于阀值的大内存块以 及小于等于阀值的小内存块的操作分别运用大内存块管理模型PMP和小内存
块管理模型SMP进行管理,并分别采用双向链表和链表数组对空闲大内存块以
及空闲小内存块进行管理,从而实现对应用系统内存使用的全面、系统的管理, 既能消除内存碎片的产生,避免内存资源的浪费,又能实现快速、可靠地分配
内存及释放。
图1示出了本发明的一个实施例提供的大内存块管理^t型PMP的示意图 在本实施例中,PMP除了采用双向链表FPL对空闲的大内存块进行管理 外,还采用单链表SL管理从系统申请过来的大块内存M,每个从系统申请过 来的大块内存的头部都将形成一个信息头SH,用于形成链表SL,在SH中存 储有该大块内存在链表SL中的节点信息。
这些大块内存会因应用系统的内存请求而被分割成很多相对较小的内存块 (但仍大于阀值),包括空闲的和使用中的,因此在SL管理的每个大块内存 中,还釆用单链表PL对这些分割形成的内存块进行管理,每个分割出的内存 块的头部则形成8字节的信息头PH,其中4字节用于指示该内存块在PL中的 前一个内存块的地址,1位标示该内存块的使用状态,还有31位用于标示该内 存块的长度。对于空闲的内存块,紧随信息头PH后的8个字节则被用作构成 双向链表FPL的前后指针。这8个字节在需要时是可以被改写的,而上述信息 头SH以及PH对于应用系统则是不可见的,即不能在申请后被使用。
图2示出了本发明的一个实施例提供的小内存块管理模型SMP的示意图 本实施例中,SMP采用链表数组A[N]来管理所有小于等于阀值的空闲的 小内存块,数组的每个元素分别管理一个固定长度的小块空闲内存链表。这些 固定的长度可以按一定字节对齐,例如假定固定长度按4字节对齐,则当阀值为256字节时,数组的长度为64,即N为63,数组元素A[O]、 A[l]、 A[2]........
A[63]则分别管理固定长度为4字节、8字节、12字节........256字节的小空
闲内存块构成的链表。数组的第一个元素管理的链表的固定长度与对齐字节相等。
当程序请求分配小内存块,而相应的数组元素链表又为空时,则可以从 PMP中的链表FPL申请大块内存以满足请求,为此SMP采用单链表S一SL对 从PMP申请过来的大内存块Q进行管理,同时将每个从PMP申请过来的大内 存块中被分割形成的内存块,包括空闲的和使用中的,形成一个单链表S—PL。 链表S_PL中的每个内存块的头部均形成有一个4字节的信息头S_PH,其中 lbit作为使用标志,15bits用于标明内存块长度,15bits用于指示前一内存块相 对本块的偏移,以及lbit保留,所述内存块长度及前一内存块相对本块的偏移 与链表数组的对其字节长度相关。由于标识长度的空间仅有15bits,故例如当 对其字节为4字节时,则从PMP申请过来的大内存块的长度要小于128K (215 x4)字节,此时阀值是大于4字节且小于128K字节的,又例如当对其字节为 8字节时,则从PMP申请过来的大内存块的长度要小于256K (215x8)字节, 此时阀值是大于8字节且小于256K字节。
此外,SMP还采用双向链表S一FPL对所有从PMP申请过来的大内存块中 被分割形成的大空闲内存块进行管理,这些大空闲内存块的前8个字节则用于 构成S—FPL的前后指针。
本发明实施例中,对于内存的分配以及释放等操作都是基于上述内存管理 模型PMP和SMP进行。
图3示出了本发明实施例提供的无MMU平台的应用系统内存管理方法的 流程,详述如下
在步骤S301中,设置系统内存使用的阀值,建立内存管理模型PMP以及 SMP,即建立上述各种纟连表,并进^"初始化。
在步骤S302中,接收应用系统的内存操作指令及相关指令参数,所述内存操作指令包括系统请求分配内存的指令、释放内存的指令等,所述指令参数则 包括系统请求分配内存的大小等参数。
在步骤S303中,当应用系统请求分配的内存大于阀值时,则在PMP中查 找匹配的内存块,并返回结果给系统,释放系统使用完的内存块。
在步骤S304中,当应用系统请求分配的内存小于等于阀值时,则在SMP 中查找匹配的内存块,并返回结果给系统,释放系统使用完的内存块。
上述步骤S303中对于大内存块的具体分配方法如图4所示,设程序请求分 配的内存长度为len,阔值为K:
在步骤S401中,在双向《连表FPL中查找匹配的空闲内存块FP。
在步骤S402中,判断是否找到匹配的空闲内存块,是则执行步骤S404, 否则执行步骤S403。
在步骤S403中,从系统申请一长度为m—size的大块内存M,所述m—size 的值为预设的常量。
在步骤S405中,判断是否申请成功,是则执行步骤S408,否则返回空内 存块,执行步骤S409。
在步骤S408中,在M的头部形成信息头SH,将M加入链表SL,并紧随 SH后形成一个内存块信息头PH一h,在PH_h中设置前向内存地址为空、使用 标志为空闲、长度为(m—size-SH长度-2fPH长度),同时在尾部也形成一个内 存块信息头PH—t,设置前向内存地址指向PH_h、使用标志为非空闲、长度为 0。然后把这个长度为(m一size-SH长度-2+PH)的大空闲内存块加入到空闲内 存双向链表FPL中,返回执行步骤S401,此时在FPL中一定能找到匹配的空 闲内存块FP。
在步骤S404中,^^测FP的长度,当FP的长度满足不等式'(FP的长度 -len) >= (K+PH头信息长度),则需要对FP进行分割,则执行步骤S406; 而当FP的长度满足(FP的长度-len)小于等于一定的冗余值,不需要对FP 进行分割,则执行步骤S407。在步骤S406中,设FP的信息头为PH—current,根据FP中的前后指针找 到FPL中紧随FP后的一个空闲内存块,设该内存块的头信息为PH_next,从 FP尾部截取长度为(len+PH的长度)的字节,形成一个新的空闲内存块FP2, 设FP2的头部信息为PH—new,修改PH一new中的前向临近块指针为PH—current, 长度为len,以及使用标志为空闲,同时修改PH一current的长度,以及修改 PH一next的前向邻近块指针为PH—new,最后返回FP2,继续一丸行步骤S409。
在步骤S407中,直接将内存块FP从链表FPL上取下,即修改FP在FPL 中的后空闲内存块的前向指针指向FP的前空闲内存块,以及修改FP的前空闲 内存块的后向指针指向FP的后空闲内存块,返回FP2,执行步骤S409。
在步骤S409中,获得返回的内存块。
在步骤S410中,判断返回的内存块是否为空,是则执行步骤S412,否则 执行步骤S411。
在步骤S412中,如果获得的内存块为空,则返回空值给应用系统,否则将 内存块相对其头部的偏移返回给应用系统。
图5则示出了本发明的一个优选实施例提供的上述步骤S303中对于大于阀 值的大内存块的释放方法的流程,在本实施例中设置有一标志位flag,用于标 识内存块释放过程中,是否需要往双向链表上添加链表节点,该标志位在初始 化时,被设置为需要添加的状态
在步骤S501中,修改应用系统指向的需要释放的大内存块的指针,使其向 前偏移内存块头部PH的长度,从而形成可操作的内存块结构体P1。
在步骤S502中,通过检测P1的长度是否大于阀值且小于从系统申请的最 大内存的长度,以及P1在PMP中的链表PL上的后一内存块所指的前一内存 块是否是P1等,来判断P1是否合法,是则执行步骤S503,否则结束释放,返 回应用系统。
在步骤S503中,判断P1在PL上的前一内存块Pp是否处于空闲状态,是则执行步骤S504,否则执行步骤S505。
在步骤S504中,将Pl与Pp合并,即修改Pp块头信息中的长度信息为合 并后的内存块长度及使用标志为非空闲,以及修改PI在PL上的后一 内存块Pn 的前向邻近内存块指针,使其指向Pp,并删除合并前PI的块头信息,使其头 部对于应用系统可见,释放指针P1则指向合并后的Pp,并且修改标志位flag 为不需在双向链表上添加节点的状态。
在步骤S505中,判断Pn是否处于空闲状态,是则执行步骤S506,否则执 行步骤S507。
在步骤S506中,将PI与Pn合并,即将Pn从FPL上取下,修改PI的长 度信息以及Pn在PL上的后一块的前向邻近内存块指针,使其指向Pl,并删除 Pn的块头信息,^使其头部对于应用系统可见。
在步骤S507中,通过检测标志位flag判断是否需要往FPL上添加链表节 点,是则执行步骤S508,否则设置PI块头信息中的使用标志为空闲,完成释 方文,返回应用系统。
在步骤S508中,将PI添加到空闲内存双向《连表FPL上,并设置PI块头 信息中的^f吏用标志为空闲,完成释放,返回应用系统。
而上述步骤S304中对于小于等于阀值的内存请求的具体分配方法则如图6 所示,设程序请求分配的内存长度为len,阀值为K,以及数组元素链表间的对 齐字节为ALIGN—BYTE:
在步骤S601中,根据len,利于关系式i =(len+ALIGN—BYTE-1)/ ALIGN—BYTE - 1,计算出数组下标,找到对应的数组元素A[i],从而找到A[i] 管理的链表A[i].list。
在步骤S602中,检测链表A[i].list中是否有内存块,是则执行步骤S604, 否则执行步骤S603。
在步骤S603中,从A[i].list中取出第一个元素Dl,往前偏移头部字节, 形成小内存块结构S1,返回Sl,执行步骤S613。在步骤S604中,4企测小内存块管理模型SMP中的双向链表S—FPL是否为 空,是则执行步骤S606,否则执行步骤S605。
在步骤S606中,向大内存块管理模型PMP中的双向链表FPL申请一块内 存M2,申请的内存长度为预设的固定值。
在步骤S609中,判断此次申请是否成功,是则执行步骤S611,否则返回 空内存块,执行步骤S613。
在步骤S611中,把申请到的大空闲内存块M2形成单链节点加入到SMP 中的S—SL链表中,并在M2的前面形成一个4字节的信息头Sh,在M2尾部 也形成一个4字节的头St,其中,Sh置值15位的前向偏移=0,长度=(M2 长度-S—SL链头长度-Sh长度-St长度),使用标志为空闲;St置值15位 的前向偏移=(Sh的长度值+Sh长度),长度=0,使用标志为非空闲,并且把 Sh指明的这个大空闲内存块加入到空闲块双向链表S—FPL中,返回执行步骤 S604。
在步骤S605中,找到S一FPL上的一个空闲块S—FP,;险测S—FP的长度是 否满足不等式S—FP的长度-^!1>=ALIGN—BYTE+信息头S—PH的长度,如果 满足,则需要对S—FP进行分割,则执行步骤S608,否则执行步骤S607。
在步骤S607中,从S—FPL上取下S—FP,往前偏移头部字节,形成一个小 内存块结构S1,返回S1,执行步骤S613。
在步骤S608中,设内存块S—FP的块头信息为H一current, S—FPL中紧随 S一FP的下 一个内存块的块头信息为H—next,从S—FP的尾部分割出(len+信息 头S—PH长度)的长度,形成一个满足需要的小内块Sl,设S1的块头信息为 H—new,修改H—current中的长度信息,并置值H—new中的长度为len,前向块 偏移为(修改后的H—current中的长度值+H—current本身长度)以及使用标志为 空闲,并修改H—next的前向偏移为(len+H—new的长度),继续执行步骤S610。
在步骤S610中,判断分割后的S_FP内存长度是否大于阀值K,是则返回 Sl,执行步骤S613,否则执行步骤S612。在步骤S612中,将S_FP从S—FPL中取下来,并将S—FP加入到与之长度 相应的数组元素的空闲内存块链表中,返回Sl,继续执行步骤S613。 在步骤S613中,得到返回的内存块。
在步骤S614中,判断返回的内存块是否为空,是则执行步骤S615,否则 执行步骤S616。
在步骤S616中,修改返回的内存块的头信息中的使用标志为非空闲。
在步骤S615中,当返回的内存块为空时,则返回空值给应用系统,否则返 回内存块相对头部的偏移给应用系统。
图7则示出了本发明的一个优选实施例提供的上述步骤S304中对于小于等 于阀值的小内存块的释放方法的流程图,本实施例中同样设置有标志位flag, 并初始置值为需要往双向链表上添加节点的状态
在步骤S701中,修改应用系统指向的需要释放的小内存块的指针,使其向 前偏移内存块头部S—PH的长度,从而形成可操作的内存块结构体S1。
在步骤S702中,判断S1是否合法,是则执行步骤S703,否则结束释放, 返回应用系统。
在步骤S703中,判断Sl在SMP中的链表S—PL上的前一内存块Sp是否 处于空闲状态,是则执行步骤S704,否则执行步骤S705。
在步骤S704中,找到Sp在SMP中对应的空闲链表,将Sl与Sp合并, 即当Sp的长度大于阀值时,则确定Sp是在SMP中的空闲双向链表S—FPL上,
以及修改Sl在S—PL上的后一内存块Sn的前向邻近内存块指针,使其指向Sp, 并删除S1的块头信息,使其头部对于应用系统可见,而释放指针S1则指向合 并后的Sp,并修改标志位flag为不需要往双向链表上添加节点的状态;当Sp 的长度小于等于阀值时,则根据Sp的长度找到其所在的数组元素链表,将Sp 从该数组元素链表中删除,修改Sp的长度信息、使用标志以及Sn的前向邻近 内存块指针,使其指向Sp,并删除S1的块头信息,使其头部对于应用系统可见,Sl则指向合并后的Sp。
在步骤S705中,判断Sn是否处于空闲状态,是则执行步骤S706,否则执 行步骤S707。
在步骤S706中,找到Sn在SMP中对应的空闲链表,将Sl与Sn合并, 即当Sn的长度大于阀值时,则Sn是在S—FPL上,贝'J将Sn从S—FPL上取下, 修改Sl的长度信息以及Sn在S—PL上的后一块的前向邻近内存块指针,使其 指向Sl,并删除Sn的块头信息,使其头部对于应用系统可见;当Sn的长度小 于等于阀值时,则根据Sn的长度找到其所在的数组元素链表,将Sn从该数组 元素链表中删除,修改Sl的长度信息以及Sn在S_PL上的后一块的前向邻近 内存块指针,使其指向Sl,并删除Sn的块头信息,使其头部对于应用系统可 见。
在步骤S707中,判断合并后Sl的长度是否大于阀值,是则执行步骤S708, 否则执行步骤S709。
在步骤S708中,检测标志位flag的值,判断是否需要往双向链表上添加 节点,如果需要则修改S1的使用标志为空闲状态,并将S1加入空闲双向链表 S—FPL ,完成释放,否则修改S1的使用标志,完成释放。
在步骤S709中,修改S1的使用标志为空闲状态,将S1加入到与S1的长 度对应的数组元素链表中,完成释放。
基于内存管理模型PMP和SMP,本发明实施例提供的内存块管理方法还 可以很方便地实现对内存使用情况的统计,以及对内存泄露和内存操作越界的 检测与控制。
通过在大块内存管理模型PMP和小块内存管理;f莫型SMP中加入统计信息, 对系统对大块内存和小块内存的使用频率以及系统内存使用的峰值进行统计, 并可以将统计结果进行反馈,依据该统计结果可以对阀值的大小进行调整。
为检测和控制内存泄露,在本发明实施例中,则可以通过在SMP中的每个 数组元素中添加一个Debug信息链表,在PMP中则维护一个Debug信息链表,通过在每个分配给应用系统的内存块的块头信息中添加信息指针,指向Debug 信息链表中的一个节点,Debug信息链表的节点由一个Debug信息结构体构成, 所述Debug信息结构体包含对上述被分配的内存地址的使用的具体信息,比如 申请到该地址的文件名、行号,以及对该地址的分配和释放操作的统计信息等, 从而在应用程序退出时通过遍历每个Debug信息节点中分配和释放操作的统计 结果是否相等,不仅可以快速地判断出内存是否出现泄露,还可以方便地查找 到可能造成内存泄露的程序代码,并通过遍历PMP中所有的PL单链表以及 SMP中所有的S—PL,可以找到所有可能泄露的内存。
为控制内存操作越界现象,则可以在紧邻每个内存信息块头前的内存空间 中添加一个Magic字l史,为该字段设置固定值,通过^^测该值是否遭到破坏来 检测内存是否出现越界,从而可以准确地发现导致内存越界的错误所在。
此外,在本发明实施例中,还可以通过采用互斥量实现对多线程的支持, 即对于PMP和SMP分别建立一个互斥量进行保护,并对于SMP中的每个数组 元素链表也分别建立一个互斥量,从而在提供线程安全的同时,尽量减少对操 作频繁的小块内存的并发效率的影响。
图8示出了本发明实施例提供的适无MMU平台的应用系统内存管理系统 的结构,为了便于说明,仅示出了与本发明实施例相关的部分。
本发明实施例提供的内存管理系统包括初始单元81、接口单元82、大块内 存操作管理单元83和小块内存操作管理单元84,其中,初始单元81在系统初 次运行时建立内存管理模型PMP和SMP,以及其它链表、互斥量等,并对链 表、标志位、互斥量等进行初始化。接口单元82则是内存管理系统与应用系统 间的指令及数据接口,接口单元82接收应用系统对内存的操作指令,包括请求 和释放等,以及相关的指令参数,例如内存请求的大小等,接口单元82根据指 令内容和参数通知相应的管理单元进行处理,并将处理结果返回给应用系统, 比如当应用系统请求的内存或想要释放的内存大于阀值时,则接口单元82将请 求的内存大小参数发送给大块分配模块831,或者将想要释放的内存地址参数发送给大块释放模块832,大块分配模块831或大块释放模块832在PMP中进 行大块内存的分配或释放处理,其中,大块分配模块831还会将内存分配处理 的结果返回给接口单元82;反之,当应用系统请求的内存或想要释放的内存小 于等于阀值时,则接口单元82将请求的内存大小参数发送给小块分配模块841, 或者将想要释放的内存地址参数发送给小块释放模块842,小块分配模块841 或小块释放模块842在SMP中进行小块内存的分配或释放处理,小块分配模块 841还会将内存分配处理的结果返回给接口单元82。
本发明实施例提供的内存管理系统还可以包括大块内存操作统计和检测单 元85以及小块内存操作统计和检测单元86,其中大块内存搡作统计和检测单 元85包括大内存使用统计模块851以及大内存安全4企测#莫块852,在应用系统 的指令控制下,分别对大块内存操作管理单元83中内存的分配、释放等操作进 行统计,以及对内存的泄露和操作越界等进行检测,并且可以将统计和检测的 结果返回给接口单元82。小块内存操作统计和;^测单元86则包括小内存使用 统计模块861以及小内存安全检测模块862,分别对小块内存操作管理单元84 中内存的分配、释放等操作进行统计,以及对内存的泄露和操作越界等进行检 测,并可以将统计和4企测的结果返回给接口单元82。
本发明实施例通过针对大于阀值的大内存块以及小于等于阀值的小内存块 的操作分别运用大内存块管理模型PMP和小内存块管理模型SMP进行管理, 从而实现对应用系统内存使用的全面、系统的管理,既能消除内存碎片的产生, 避免内存资源的浪费,又能实现快速、可靠地分配内存及释放,而且还通过在 内存管理模型中加入统计信息和检测链表等,很方便地实现对内存使用情况的 统计,以及对内存泄露、操作越界等现象的检测和控制,还可以实现对多线程 的支持。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发 明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明 的保护范围之内。
权利要求
1、一种无MMU平台的应用系统内存管理的方法,其特征在于,所述方法包括设置系统内存使用的阀值,对于大于阀值的大块内存建立内存管理模型PMP进行管理,对于小于等于阀值的小块内存建立内存管理模型SMP进行管理,所述内存管理模型PMP中建有双向链表FPL,管理PMP中所有大于阀值的空闲内存块,所述内存管理模型SMP中建有链表数组,管理SMP中所有小于等于阀值的空闲内存块;接收系统请求分配内存的指令及参数,所述参数包括系统请求分配的内存长度;当请求分配的内存大于阀值时,则在PMP中查找匹配的内存块,并返回结果给系统,释放系统使用完毕的内存块;或当请求分配的内存小于等于阀值时,则在SMP中查找匹配的内存块,并返回结果给系统,释放系统使用完毕的内存块。
2、 如权利要求1所述的无MMU平台的应用系统内存管理方法,其特征在 于,所述内存管理模型SMP中的链表数组中的每个数组元素管理一个由大小相 同且固定的小空闲内存块构成的链表,且每个数组元素链表管理的内存大小按 固定字节对齐。
3、 如权利要求1所述的无MMU平台的应用系统内存管理方法,其特征在 于,所述内存管理模型PMP中还包括用于管理从系统申请过来的大块内存的单 链表SL,以及用于将每个从系统申请过来的大块内存中的各内存块链接起来的 单链表PL。
4、 如权利要求1所述的无MMU平台的应用系统内存管理方法,其特征在 于,所述内存管理模型SMP中还包括用于管理从所述内存管理模型PMP中申 请过来的大块内存的单链表S—SL,以及用于管理SMP中所有大于阀值的空闲 大内存块的双向链表S一FPL,以及用于将每个从PMP中申请过来的大块内存中的各内存块链接起来的单链表S—PL。
5、 如权利要求3所述的无MMU平台的应用系统内存管理方法,其特征在 于,所述当请求分配的内存大于阀值时,则在PMP中查找匹配的内存块,并返 回结果给系统包括下述步骤在FPL中查找匹配的空闲内存块;当在FPL中没有找到匹配的空闲内存块,则从系统申请一大块内存;当从系统成功申请一大块内存,则在该大块内存中分别形成用于构成链表 SL的节点的信息头SH,以及用于构成链表PL的节点的信息头PH,所述信息 头PH的长度为8字节,其中4字节指示前内存块地址、l位标示使用状态,以 及31位标示本内存块长度,将该大块内存加入链表FPL和SL,并继续在FPL 中查找匹配的空闲内存块,当从系统申请内存失败,则返回空内存块;当在FPL中找到匹配的空闲内存块,且当该空闲内存块的长度与请求分配 的内存长度之差大于等于阀值与信息头PH的长度之和,则在该空闲内存块的 尾部进行分割,并返回分割后形成的新的空闲内存块,而当找到的空闲内存块 的长度与请求分配的内存长度之差小于等于固定的冗余值,则将该空闲内存块 从FPL中取下,并返回该内存块;判断返回的内存块是否为空,是则返回空值给应用系统,否则将返回的内 存块相对其头部的偏移返回纟会应用系统。
6、 如权利要求3所述的无MMU平台的应用系统内存管理方法,其特征在 于,在所述当请求分配的内存大于阀值时,则在PMP中查找匹配的内存块,并 返回结果给系统,释放系统使用完毕的内存块的步骤中,对于大于阀值的大内 存块"释放包括下述步骤形成能够进行释放操作的内存块结构体; 判断要释放的内存块是否合法,否,则直接结束释放; 当要释放的内存块合法时,判断其在所述链表PL中的前内存块是否空闲, 是则进行合并;判断其在所述链表PL中的后内存块是否空闲,是则进行合并;判断是否要往所述双向链表FPL上添加节点,是则修改要释放的内存块的使用标志,并加入FPL,完成释放,否则修改要释放的内存块的使用标志即完成释放。
7、 如权利要求4所述的无MMU平台的应用系统内存管理方法,其特征在 于,所述当请求分配的内存小于等于阀值时,则在SMP中查找匹配的内存块, 并返回结果给系统包括下述步骤根据请求分配的内存长度找到对应的数组元素链表,当该数组元素链表不 为空,则在该数组元素链表上取出一内存块,并返回该内存块;当对应的数组元素链表为空,则判断所述双向链表S—FPL是否为空;当S—FPL为空,则从所述内存管理模型PMP申请一大块内存,当申请成 功,则在该大块内存中形成用于构成链表S—PL的节点的信息头S—PH,所述信 息头S一PH的长度为4字节,其中lbit标示使用状态,15bits标示本内存块长 度,15bits指示前一内存块相对本块的偏移,还有lbit保留,将处理后的该大 块内存加入链表S一SL和S一FPL,继续判断所述双向链表S—FPL是否为空,当 申请不成功,则返回空内存块;当S—FPL不为空,判断在S—FPL上找到的空闲内存块的长度与请求分配 的内存长度之差是否大于等于第一个数组元素链表管理的内存长度与信息头 S—PH的长度之和,是则在该空闲内存块的尾部进行分割,返回分割后形成的 新的空闲内存块,并当分割后余下的内存长度大于阀值时,则将余下的内存块 加入相应的数组元素链表,否则将在S一FPL上找到的空闲内存块从S一FP中取 下,并返回该内存块;判断返回的内存块是否为空,是则返回空值给应用系统,否则将返回的内 存块相对其头部的偏移返回给应用系统。
8、 如权利要求4所述的无MMU平台的应用系统内存管理方法,其特征在 于,所述或当请求分配的内存小于等于阀值时,则在SMP中查找匹配的内存块,并返回结果给系统,释放系统使用完毕的内存块的步骤中,对于小于等于阀值 的小内存块的释放包括下述步骤形成能够进行释放操作的内存块结构体;判断要释放的内存块是否合法,否,则直接结束释放;当要释放的内存块合法时,判断其在所述链表S一PL中的前内存块是否空 闲,是则进行合并;判断其在所述链表S一PL中的后内存块是否空闲,是则进行合并;当此时要释放的内存块的长度d、于等于阀值,则将其加入相应的数组元素 链表;当此时要释放的内存块的长度大于阀值,则判断是否需要往所述双向链表 S一FPL上添加节点,是则修改要释放的内存块的使用标志,并加入S—FPL,完 成释放,否则修改要释放的内存块的使用标志即完成释放。
9、 一种无MMU平台的应用系统内存管理系统,其特^正在于,所述系统包括初始单元,用于建立对大于阀值的大块内存的操作进行管理的内存管理模 型PMP,以及建立对小于等于阀值的小块内存的操作进行管理的内存管理模型 SMP,所述内存管理才莫型PMP中包含双向链表FPL,管理PMP中所有大于阀 值的空闲内存块,所述内存管理^t型SMP中包含链表数组,管理SMP中所有 小于等于阀值的空闲内存块,以及对系统进行初始化;接口单元,用于接收应用系统对内存的操作指令及参数,以及将指令的执 行结果返回给应用系统,所述操作指令包括系统请求分配内存的指令,所述参 数包括系统请求分配的内存大小;大块内存操作管理单元,用于对应用系统请求分配或需要释放的内存大于 阀值时,在所述内存管理模型PMP中,实现内存的分配或释放;以及小块内存搡作管理单元,用于对应用系统请求分配或需要释放的内存小于 等于阀值时,在所述内存管理模型SMP中实现内存的分配或释放。
10、如权利要求9所述的无MMU平台的应用系统内存管理系统,其特征 在于,所述内存管理模型PMP中还包括用于管理从系统申请过来的大块内存的 单链表SL,以及用于将每个从系统申请过来的大块内存中的各内存块链接起来 的单链表PL。
11 、如权利要求9所述的无MMU平台的应用系统内存管理系统,其特征 在于,所述内存管理模型SMP中还包括用于管理从PMP中申请过来的大块内 存的单链表S—SL,以及用于管理SMP中所有大于阀值的空闲大内存块的双向 链表S—FPL,以及用于将每个从PMP中申请过来的大块内存中的各内存块链接 起来的单链表S—PL。
12、 如权利要求9所述的无MMU平台的应用系统内存管理系统,其特征 在于,所述链表数组中的每个数组元素管理一个由大小相同且固定的小空闲内 存块构成的链表,且每个数组元素链表管理的内存大小按固定字节对齐。
13、 如权利要求IO所述的无MMU平台的应用系统内存管理系统,其特征 在于,所述大块内存操作管理单元包括大块分配模块,用于在所述内存管理模型PMP中的双向链表FPL上查找 满足请求的空闲内存块,并返回查找结果;以及大块释放模块,用于对系统使用完毕的大于阀值的内存块进行释放,以及 将所需释放内存块与在所述内存管理模型PMP中的链表PL上的紧邻空闲内存 块进行合并。
14、 如权利要求11所述的无MMU平台的应用系统内存管理系统,其特征 在于,所述小块内存操作管理单元包括小块分配模块,用于在所述内存管理模型SMP中的相应的数组元素链表或 者双向链表S—FPL上查找满足请求的空闲内存块,并返回查找结果;以及小块释放模块,用于对系统使用完毕的小于等于阀值的内存块进行释放, 以及将所需释放内存块与在所述内存管理模型SMP中的链表S—PL上的紧邻空 闲内存块进4亍合并。
15 、如^L利要求9所述的无MMU平台的应用系统内存管理系统,其特征 在于,所述系统还包括大块内存操作统计和检测单元,用于对所述大块内存搡作管理单元的内存 分配及释放操作进行统计,并在所述内存管理模型PMP中对内存的泄漏即操作 越界情况进行^佥测和控制;以及小块内存操作统计和检测单元,用于对所述小块内存操作管理单元的内存 分配及释放操作进行统计,并在所述内存管理模型SMP中对内存的泄漏即操作 越界情况进行检测和控制。
全文摘要
本发明适用于内存管理领域,提供了一种无MMU平台的应用系统内存管理的方法及系统,包括设置内存阀值,对于大块内存建立内存管理模型PMP进行管理,对于小块内存建立内存管理模型SMP进行管理,所述PMP中建有双向链表FPL,管理PMP中所有大于阀值的空闲内存块,所述SMP中建有链表数组,管理SMP中所有小于等于阀值的空闲内存块;接收系统请求分配内存的指令及参数,所述参数包括请求分配的内存长度;当请求分配的内存大于阀值,则在PMP中查找匹配的内存块,并返回结果给系统,释放系统使用完毕的内存块;或当请求分配的内存小于等于阀值,则在SMP中查找匹配的内存块,并返回结果给系统,释放系统使用完毕的内存块。
文档编号G06F12/06GK101470665SQ20071012553
公开日2009年7月1日 申请日期2007年12月27日 优先权日2007年12月27日
发明者罗寿中 申请人:Tcl集团股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1