您的位置:首页 > 其它

MTK 内存管理简单总结 2

2013-03-11 22:03 211 查看
MTK 内存管理简单总结 中,大体说了MTK的三种内存分配方式,对于第三种,也就是app buffer,是比较丰富的一种。在 MTK 平台中也有许多具体的实现。在代码里搜索一下 kal_adm_create 就可以发现有许多地方使用了。看一个比较典型的使用:在文件app_mem.c里,有两个memory pool,一个是用于应用之间共享内存,另一个是用于屏幕内存。第一种内存,主要是用于各种应用之间共享内存(以下简称ASM),这样可以节省内存,MTK实现了一种机制,可以在多个应用之间共享内存当当前应用想获得的共享内存不足时,MTK会通知后台应用释放相应的内存。这套机制在AppMemMgr.c里面实现。先看一下初始化该内存次池函数void applib_mem_ap_init(void (*stop_finish_callback_by_MMI)(kal_uint32 app_id, kal_uint32 string_id, kal_bool result))这个函数带有一个参数,这个参数是一个函数指针,该回调函数有3个参数,app_id,(应用id),string_id 和 result。这个回调函数比较特别,是当一个后台应用 被 要求释放内存,释放完毕后调用的。为什么要搞这么一个函数,因为一些应用比较复杂,释放内存的同时需要关闭一些资源,而这些动作是异步的,等这些异步发的操作多完成时,调用一些函数,告诉ASM,内存释放完毕。 具体实现:通过 调用 kal_adm_create 来创建一个内存池,然后保存了一些回调函数,没有什么特别的地方,内存池的大小 是 APPLIB_MEM_AP_POOL_SIZE 来确定的,可以通过修改 app_asm_pool_union 来修改内存池的大小。 应用分配内存void *applib_mem_ap_alloc(kal_uint32 app_id, kal_uint32 mem_size)应用通过上面的函数来获得ASM的内存,参数一 app_id,是当前分配内存的id,这个id需要自己定义,并且注册(下文说明),参数二是实际需要分配的内存大小。具体实现:先mem_size 进行了处理,让其四字节对齐。然后通过 kal_adm_alloc 获得内存,不过这个内存加上了一个头结构和尾结构,(头和尾都加入了特殊字符,再释放时进行检查,这个可以判断内存是否越界)。然后把这个内存插入到list的头部。转自:http://blog.csdn.net/yanwuxufeng/archive/2010/07/13/5733138.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: