- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
MTK的内存管理
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提供了其他的内存管理方式
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里面实现。
先看一下初始化该内
您可能关注的文档
最近下载
- 2025年秋人教版英语八年级上册Unit 1 Happy Holiday 教案教学设计.docx VIP
- 消除“艾梅乙”医疗歧视-从我做起!.pptx VIP
- 《饮用水源保护区》课件.ppt VIP
- 2025医疗器械偏差管理规程.docx VIP
- 三、功(教学课件)物理苏科版2024九年级上册.pptx VIP
- 2025年巩固拓展脱贫攻坚成果同乡村振兴有效衔接总结15篇 .pdf VIP
- 糖尿病合并高血压患者管理指南2025解读.pptx
- 石家庄空港工业园规划.pptx VIP
- 以中国式现代化全面推进中华民族伟大复兴PPT新时代坚持和发展中国特色社会主义的目标任务PPT课件(带内容).pptx VIP
- 大数据分析师(高级)试题(含答案).pdf VIP
文档评论(0)