- 浏览: 38148 次
- 性别:
- 来自: 安徽
最新评论
MTK 手机用的操作系统是 nucleus, 这是一个rtfs(实时操作系统),这个rtfs本身是不带内存管理功能,所以MTK自己写的内存管理。
(nucleus在系统初始化完毕时,会调用Application_Initialize,参数就是可使用内存的起始地址)
大体上来分,MTK内存可以分为3种:
control buffer
平常使用的OslMalloc就是这个内存。
这个内存内部实现是按块来划分的(pool),具体的配置可以custom_config.c 文件里的custom_config_ctrl_buff_info()里看到
里面的size 指定了这个块的大小,no_of_buff 指定了有多少个这样的块。
按块来管理内存,可以有效地控制内存的碎片,管理也相对简单,可能会造成内存的一些浪费
对于手机这种需要长时间运行不重起的设备来说,还是很有必要的。
MTK 默认最大块的大小为 2048byte,也就是2k。这就是说用OslMalloc 分配内存默认最大能分配到2k,
这个可以看custom_config_ctrl_buff_info()配置可以看到。
可以通过修改里面的配置来改变这个值,不过一般不这么做,因为MTK提供了其他的内存管理方式
#define OslMalloc(nob) get_ctrl_buffer(nob)
#define OslMfree(frp) free_ctrl_buffer(frp)
少于2K 使用get_ctrl_buffer。
大于2K 使用adm
system buffer
system buffer 平时我们用不到,听名字也是系统使用的。
主要是提供 run-time usage,是一块 semi-static memory(什么意思?)
比如 block of task, task stack ,control block of control buffer ,buffer pool等等
在 custom_config.c里面配置 ,主要有两个宏 GLOBAL_MEM_SIZE 和 GLOBAL_DEBUG_MEM_SIZE
两个 static 数组 static kal_uint32 System_Mem_Pool[GLOBAL_MEM_SIZE/sizeof(kal_uint32)];
和 static kal_uint32 Debug_Mem_Pool[GLOBAL_DEBUG_MEM_SIZE/sizeof(kal_uint32)];
为了满足时间要求,也就是要求快速分配,系统内存又分为 internal system memory 和 system memory
前者link 到 internal SRAM ,后者link 到 external SRAM
app buffer
app的内存是使用通过MTK 提供的一种ADM(application dynamic memory)机制来实现,ADM 主要的功能是通过管理一个数组来实现内存的分配。
ADM 也是通过内存块(pool)来实现的,具体无法看到其代码。app通过这个adm这个机制,可以更加灵活的使用内存,比如分配大内存(大于2k)等等
主要函数
创建 adm
KAL_ADM_ID kal_adm_create(void *mem_addr, kal_uint32 size, kal_uint32 *subpool_size, kal_bool islogging);
删除函数
kal_status kal_adm_delete(KAL_ADM_ID adm_id);
分配函数
extern void *kal_adm_internal_alloc(KAL_ADM_ID adm_id, kal_uint32 size, char *filename, kal_uint32 line);
#define kal_adm_alloc(adm_id, size) kal_adm_internal_alloc(adm_id, size, __FILE__, __LINE__)
释放函数
extern void kal_adm_free(KAL_ADM_ID adm_id, void *mem_addr);
在 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的头部。
昨天说到了内存的分配。下面看一下内存释放
主要进行了3步:
static void applib_mem_ap_free_int(void *mem_ptr)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
applib_mem_header_struct *header, *prev_node, *remove_node;
applib_mem_footer_struct *footer;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
if (g_applib_mem_cntx.app_pool_id) /* Normal mode */
{
ASSERT(mem_ptr && APPLIB_MEM_ALIGNED_4(mem_ptr));
header = ((applib_mem_header_struct*) mem_ptr) - 1;
footer = (applib_mem_footer_struct*) (((char*)mem_ptr) + header->chunk_size);
ASSERT(APPLIB_MEM_COMP_PATTERN(header->guard_pattern, APPLIB_MEM_HEADER_PATTERN1) &&
APPLIB_MEM_COMP_PATTERN(footer->guard_pattern, APPLIB_MEM_FOOTER_PATTERN1));
/*
* Remove the block from linked list
*
* It is not a fast algorithm, we can improve it by using double linked list,
* but we choose simpler design because
* 1. Typically total allocation count is small
* 2. We don't want to increase space overheads
* 3. We don't want to access KAL ADM internal data structure
*/
prev_node = &g_applib_mem_cntx.app_head;
ASSERT(prev_node->next);
for (remove_node = prev_node->next;
remove_node;
prev_node = remove_node, remove_node = prev_node->next)
{
if (remove_node == header)
{
break;
}
}
ASSERT(remove_node);
prev_node->next = remove_node->next;
/* Set guard pattern */
APPLIB_MEM_SET_PATTERN(header->guard_pattern, APPLIB_MEM_HEADER_PATTERN2);
APPLIB_MEM_SET_PATTERN(footer->guard_pattern, APPLIB_MEM_FOOTER_PATTERN2);
/* Release the block */
#ifdef APPLIB_MEM_USE_ADM
kal_adm_free(g_applib_mem_cntx.app_pool_id, header);
#else
free(header);
#endif
ASSERT(g_applib_mem_cntx.app_alloc_count > 0);
g_applib_mem_cntx.app_alloc_count--;
}
else /* Full pool mode */
{
ASSERT(mem_ptr == g_applib_mem_ap_pool && g_applib_mem_cntx.app_alloc_count == 1);
g_applib_mem_cntx.app_alloc_count = 0;
g_applib_mem_cntx.app_id_of_full_pool = APPLIB_MEM_AP_ID_DUMMY; /* 0 */
#ifdef APPLIB_MEM_USE_ADM
g_applib_mem_cntx.app_pool_id = kal_adm_create(
g_applib_mem_ap_pool,
APPLIB_MEM_AP_POOL_SIZE,
(kal_uint32*) g_applib_mem_pool_chunk_size,
KAL_FALSE);
#else /* APPLIB_MEM_USE_ADM */
g_applib_mem_cntx.app_pool_id = APPLIB_DUMMY_POOL_ID;
#endif /* APPLIB_MEM_USE_ADM */
}
}
取得内存的头部和尾部,(调试版本可以判断内存是否越界)
从链表中删除这个节点
调用 kal_adm_free 释放内存
在MTK 内存管理简单总结 2 提到调用 applib_mem_ap_alloc 分配内存是需要一个应用id,这个id是需要自己增加,
而且在调用这个函数之前必须 调用 applib_mem_ap_register 注册这个id。需要注意的是最后一个参数,是一个回调函数,
这个回调函数是在共享内存不够使用时,ASM会调用这个函数,告诉应用需要释放共享内存,供其它应用使用。
增加 id 在 app_mem.h 的 applib_mem_ap_id_enum 里面,只要添加一个id就可以。
同样 屏幕内存也是通过ADM来管理,屏幕内存 是用来 创建 layer 用的,在MTK的某个版本开始,创建layer的内存是有要求的,
需要applib_mem_screen_alloc 分配的内存。
void *Malloc(uint32 dwSize)
{
#ifdef WIN32
return (void *)malloc(dwSize);
#else
return (void *)med_alloc_ext_mem(dwSize);
#endif
}
如何在MTK上分配一块较大的内存?
本文来自:我爱研发网(52RD.com) - R&D大本营
详细出处:http://www.52rd.com/bbs/Archive_Thread.asp?SID=89009&TID=2
如过分配比较大内存,慎用 OslMalloc 其对应内存池比较小,并且对单次分配内存大小有限制
建议用 med_alloc_ext_mem
其对应内存池大小 #define MED_EXT_MEM_SIZE (sizeof(med_ext_mem_union))
如果需要还可以增大
MTK是如何申请内存空间的???
本文来自:我爱研发网(52RD.com) - R&D大本营
详细出处:http://www.52rd.com/bbs/Archive_Thread.asp?SID=187949&TID=3
1 oslmalloc
用于control buffer申请,size有限制,一般使用于较小buffer(通常0 - 2k)的申请。
2 app_malloc
ASM机制。用于应用共享内存的申请,需要注册ID,如有内存冲突,系统会提示停掉正在使用的APP,供用户选择停止。
3 scr_malloc
用于屏幕buffer申请,模板内部使用。
4 med_ext_malloc
用于申请较大块内存(2k - ?),从MED pool中。申请释放都比较简单,不用注册ID,但是注意free函数参数,需要对应2级指针。
med_free_ext_mem( (void **) &tempBuf );
MTK内存动态申请释放
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/feelinghappy/archive/2010/02/22/5317615.aspx
1. OslMalloc OslMfree
为一个般的程序分配内存,用来保存一般性的数据,效率高,不能分配太大内存,else程序会挂掉
2. media_get_ext_buffer media_free_ext_buffer
可以分配较大内存,与OslMalloc 有着数量级区别,比如读一个比较大的文件操作时,要分配的buffer就要这个 ,这个不是在堆上分配的,和寄存器有关系
3. gui_malloc gui_free
一般是用来合并图层,保存图层,MTK默认只分配了一个图层的空间,如果你用到了多层的话,就得另外分配内存了,就用这个
1. OslMalloc OslMfree
这两个函数就是直接define 的 ctrl buffer的函数 作用分配内存和malloc free功能类似
实际上是用一块内存池中分配和释放内存,具体实现是在ctrl_buff_pool.c里面做的
2. media_get_ext_buffer media_free_ext_buffer
因为task之间的函数不便互相调用,MDI等task在分配内存的时候会使用这对函数,实际实现时通过给MOD_SAP发送request buffer消息来获取内存
3. gui_malloc gui_free
这对函数和第一对函数的实现时完全一样的 只是提供给不同的module使用而已
还有,我在网上看到一个名词“Ctrl Buffer机制”,这个到底是什么东东?
Ctrl buffer机制实际上就是MTK内部的内存池管理机制的一种,对上面的感觉和malloc free一样,但是内存的数量是固定的,比如1024的buffer一般来说只有2个或者4个 低端版本甚至只有一个
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/manlt/archive/2010/09/30/5916738.aspx
============================================================================
MTK 内存管理简单总结
http://blog.csdn.net/yanwuxufeng/archive/2010/07/12/5730092.aspx
MTK 内存管理简单总结 2
http://blog.csdn.net/yanwuxufeng/archive/2010/07/13/5733138.aspx
MTK 内存管理简单总结 3
http://blog.csdn.net/yanwuxufeng/archive/2010/07/14/5735911.aspx
MTK 内存管理简单总结 4
http://blog.csdn.net/yanwuxufeng/archive/2010/07/16/5740999.aspx
MTK 内存管理简单总结 5
http://blog.csdn.net/yanwuxufeng/archive/2010/07/17/5743273.aspx
发表评论
-
PPPD拨号返回结果码
2015-09-18 11:12 73200: pppd已经断开,或者已经成功建立连接后请求方又中 断 ... -
3G相关定时器说明
2014-08-06 10:05 883计时器和计数器RNC 计 ... -
PDP激活被拒绝原因码表
2012-07-19 20:55 2831om: http://wireless.agilent.com ... -
PDP激活被拒绝原因码表
2012-07-19 20:15 0方便查询:这些值是真正的原因,但要注意分析问题时尤其对二次开发 ... -
TCP重传
2012-07-03 20:23 1153为什么TCP存在重传 TCP是 ... -
MTK NVRAM
2012-06-28 19:50 1658nvram是程序用来搭建FAT文件系统的那一块,是fla ... -
TBF与PDP激活
2012-06-18 21:28 1196PDP先激活,CCCH上下行TBF建立流程如下:1、下行TBF ... -
C语言中的内存对齐问题
2012-05-29 10:31 788.C语言中的内存对齐 ... -
MTK Timer
2012-04-18 14:33 41341. GPTI_StartItem 要精准很多,但是只能 ... -
WinSocket编程——原始套接字[转]
2012-03-26 09:23 4904WinSocket编程——原始套接字[转] ... -
TCP三次握手各种异常
2012-03-20 11:04 1405和TCP三次握手有关的面试题 分类: 网络 ... -
Windows API串口编程参考
2012-03-15 14:12 3448Windows API串口编程参 ... -
V.24 & V.35
2012-03-12 20:25 982V.24 & V.35 (2011-08 ... -
【C语言】while与for执行效率对比【转】
2012-03-12 19:00 1664【C语言】while与for执行效率对比【转】 C语言 ... -
[转]ASCII,Unicode,UTF-8,GB2312编码之间的关系
2012-03-12 18:59 942[转]ASCII,Unicode,UTF-8,GB231 ... -
NVRAM的简单添加 【转】
2012-02-29 10:14 851NVRAM的简单添加 MTK 在这里我只 ... -
MTK获取基站的cell_id 【转】
2012-02-29 10:07 1059MTK获取基站的cell_id 博客分类 ... -
MTK的HTTP连接方式
2012-02-29 10:08 892MTK的HTTP连接方式 博客分类: ... -
MTK中怎样创建和使用lib
2012-02-28 17:17 734MTK中怎样创建和使用lib 博客分类: MT ... -
MMI 和L4通信【转】
2012-02-28 17:16 1142MMI 和L4通信 博客分类: MTK ...
相关推荐
MTK内存管理机制是MediaTek(联发科)在设计其处理器平台时采用的一种内存管理系统,旨在高效地分配、管理和优化内存资源。MediaTek是一家知名的半导体公司,其芯片广泛应用于智能手机、电视、无线通信设备等多个...
MTK内存管理主要针对的是基于Nucleus实时操作系统的手机平台。由于Nucleus操作系统自身不包含内存管理功能,因此MTK(MediaTek)需要自定义一套内存管理系统。MTK的内存管理主要分为三大类:Control Buffer、System ...
### MTK内存管理详解 #### 一、MTK内存管理概述 MTK(MediaTek)作为移动设备领域的重要参与者之一,其内存管理机制是保证系统稳定性和性能的关键部分。本文将深入探讨MTK中的内存管理机制,特别是针对“App ...
MTK内存管理机制中的`mtk_task_malloc`和`mtk_task_free`函数提供了对这种特殊内存管理的支持。这两个函数的工作方式如下: - `mtk_task_malloc(void **p, int size);`:此函数尝试为用户分配指定大小的内存。值得...
在 MTK 面试中,常见的问题有多个方面,包括按键处理流程、高亮处理机制、MTK 内存管理、任务管理、事件机制和定时器消息机制等。下面将逐一介绍这些知识点。 按键处理流程 按键处理流程是 MTK 软件 framework 中...
实现内存复用的关键在于准确的时间规划和内存管理,包括但不限于: - **时间调度**:确定每个程序的运行周期和内存需求,合理安排内存的占用和释放时间。 - **内存分割**:将物理内存分割成多个逻辑分区,以便于按...
在这个“MTK大内存分区调整教程”中,我们将深入探讨如何优化基于MTK CPU的手机的内存分区,以提升设备性能和存储空间利用率。内存分区是手机系统管理内部存储的关键部分,通过调整这些分区,我们可以优化手机的运行...
在MTK平台上,还可以利用一些专用工具进行内存管理,比如内存优化器,它们能智能分析并清理内存,提高设备运行速度。同时,对于开发人员,理解内存分配和回收机制也非常重要,避免内存泄漏和过度分配,这可以通过...
1. 内存管理:MTK 10A平台需要有效分配和回收内存资源,包括RAM(随机访问存储器)和ROM(只读存储器)。这包括内存的分配策略、垃圾回收机制以及内存泄漏检测,以确保系统运行流畅,避免因内存不足导致的系统崩溃。...
6. **性能优化**:针对MTK设备进行性能调优,例如利用硬件加速特性,减少内存占用,提高加载速度。 7. **兼容性测试**:在不同型号的MTK设备上进行测试,确保工具在各种环境下都能稳定运行。 8. **错误处理**:...
- **内存管理**:嵌入式系统资源有限,因此对内存的高效管理是必要的。了解如何分配、释放内存以及优化内存使用是MTK开发的关键技能。 - **线程与并发**:多线程编程在MTK平台上用于实现并发处理,了解线程同步、...
1. MTK芯片平台:了解MTK不同系列的芯片特性,如处理器架构、内存管理、图形处理单元(GPU)等,这对于优化软件性能至关重要。 2. 驱动程序开发:MTK平台的驱动程序开发包括HAL层(Hardware Abstraction Layer)和内核...
在IT行业中,内存管理是系统优化的关键环节,尤其是在嵌入式设备和移动设备上,如基于MediaTek(MTK)平台的设计装置。本篇文档主要探讨了如何在MTK平台上进行有效的内存分配状况监控,以确保系统的稳定运行和资源的...
总的来说,MTK WWR刷机工具为MTK设备用户提供了一种便捷的固件管理方式,但同时也需要用户具备一定的技术知识和风险意识。在进行刷机操作时,谨慎对待每一步,遵循安全规范,才能确保设备的稳定和安全。
3. Memory Monitor:监控内存使用情况,防止内存泄漏。 4. CPU Profiler:追踪CPU使用率,优化代码性能。 七、MTK平台的优化 优化主要包括性能优化和功耗优化。性能优化关注代码效率,减少不必要的计算;功耗优化则...
- 内存分配:介绍内存管理机制,如物理内存分配、虚拟内存映射等。 - 内存泄漏检测:阐述如何定位和修复内存泄漏问题。 2. 网络驱动调试: - Wi-Fi驱动:探讨Wi-Fi模块的驱动架构,包括STA模式和AP模式的实现。 ...
MTK通用烧录工具,全称为SP Flash...总之,MTK通用烧录工具是Android开发和维护人员的得力助手,其强大的功能和广泛的适用性使其在MTK设备的软件管理中不可或缺。然而,使用时务必谨慎,遵循正确步骤,以确保设备安全。
- **内存管理**:MTK JVM具备智能的内存分配和垃圾回收机制,有效防止内存泄漏,保障系统的稳定运行。 - **线程调度**:支持多线程并行执行,提高应用程序的并发性能。 - **本地接口**:允许Java代码调用C/C++...
2. **CPU和内存性能测试**:通过执行高强度计算任务来评估CPU的处理能力和内存管理效率,确保设备在多任务环境下能流畅运行。 3. **网络测试**:检验数据连接、网络速度、信号强度,以及不同网络环境(如2G、3G、4G...