内存管理


1.内存管理。
平台不提供动态分配内存的方式;应用程序需要使用动态分配内存时,可以采用以下几种方式:
与系统其他模块共享内存,典型的是使用MED模块的内存;
定义一个静态数组,交给系统adm托管,然后调用 kal_adm_alloc、kal_adm_free等内存操作函数实现动态内存分配;
定义一个静态数组,应用自己实现基于此数组的分配和管理,也就是实现自己的内存管理模块。

2.内存分配机制

   在MTK的资料中,介绍了它的内存管理机制,有3种:ADM、Control buffer、System Memory。后两个是系统使用的,与上层应用无关。但是我对kal_system_alloc也做了初步分析。
   sys_mem_ptr,其估计应该指向的是 System_Mem_Pool,debug_mem_ptr,其估计应该指向的是 debug_Mem_Pool。经过初步分析,kal_system_alloc就是从System_Mem_Pool做简单的加法操作,sys_mem_left_size就是 System_Mem_Pool还剩下多少。kal_system_alloc从sys_mem_ptr开始来计算要取的内存。ctrl_buf是通过 kal_system_alloc的内存,然后再通过NU_Create_Partition_Pool创建POOL。系统的一些task stack.等也都是通过kal_system_alloc来分配的。

   也就是说,Control buffer、System Memory用的都是System_Mem_Pool的空间。而System_Mem_Pool可以查到,是在custom_configmem函数中配置。
 
ADM就完全没有使用操作系统提供的内存管理算法,是平台自创了一套。开发者,可以自己开辟一个POOL,自己在这个池用ADM提供的内存管理API完成内存的动态管理。具体的分配算法,就没有再细看,跟一些通用的内存分配算法应该一致。但是在以前调试一个问题的时候,应该是可以断定,ADM在每一个alloc node前后都加了GAP调试区,来判断是否被overwrite。

   至于系统中,到底是用了多少块内存用于ADM,各块内存又是让哪些应用在共享,开发者可能更清楚。在系统中是否建立了对内存动态分配的监控机制,比如查询内存泄漏、动态内存使用效率等等。

3

少于2K 使用get_ctrl_buffer。
大于2K 使用adm
get_ctrl_buffer是在系统定义的一块区域申请空间。 这段空间被分为好多块均等大小。好像有以下几种方式:
2个 1K*2
4个 0.5K*4
6个 0.25K*8
....
申请的话,按首适应算法。这就是你所说的小块内存管理。
adm主要是你自己定义的一块全局数组比如400K.
你可以使用它的adm相关函数去动态申请释放这400K大小的区域,维护也靠你自己。
本文来源于无声无息 http://www.imeans.net/ , 原文地址:http://www.imeans.net/post/201004/45.html

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值