内存管理

Linux 内存管理 本文详细的介绍了多种内存管理方式,同时详细介绍了Linux下的内存管理方式 阅读详情


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

 

内存管理内存管理的概念 内存管理内存管理的概念 为什么进行内存管理 页式管理中每个页表项大小的下限如何决定 多级页表解决了什么问题,带来了什么问题 1. 内存管理的基本原理和要求 1.1 定义 操作系统对内存的划分和动态分配就是内存管理的概念 1.2 内存管理的功能 内存空间的分配和回收:由操作系统完成对主存的分配和回收,对编程人员透明 地址转换:使逻辑地址转换为真实的物理地址 内存空间的扩充:利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存 存储保护:保证各道作业在各自的存储空间内运行,互不干扰 1.3 程 阅读详情

相关推荐

内存管理笔记九、段页式内存管理

内存管理笔记九、段页式内存管理 引言:在前面几篇笔记中,我们介绍到内存管理的多种方式,包括单道编程下固定加载地址,多道编程下固定分区、非固定分区、分页式内存管理,这些是内存管理模式不断演进的过程,本篇笔记将介绍现今广泛使用的段页式内存管理模式。至此,内存管理模式的演进基本就结束了,后面关于内存管理的笔记,将重在实践实现,包括虚拟内存性能调整、slab分配机制、buddy算法等学习。 一、分...

邓博学习笔记 1460

MTK 面试的主要问题

1按鍵處理流程主要简单分析一下左右软件的事件,以左软键事件为例牵涉到的常用函数:     void SetKeyHandler( FuncPtr funcPtr, U16 keyCode, U16 keyType );     void SetLeftSoftkeyFunction( void (*f)(void), MMI_key_event_type k );     void ChangeLeftSoftkey( U16 s, U16 i );1.   SetKeyHandler与SetLef

spanthrive的专栏 1157

裸机内存管理解析

概述 在计算机系统中,变量、中间数据一般存放在系统存储空间中,只有实际使用的时候才将他们从存储空间调入到中央处理器内部进行计算。通常存储空间分为两类:内部存储空间和外部存储空间。对于电脑来讲,内部存储空间就是电脑的内存,外部存储空间就是电脑的硬盘。而对于单片机来讲,内部存储就是 RAM ,随机存储器。外部存储可以理解为 flash ,掉电不丢失。该篇文章的主题,内存管理,主要讨论的是关于 RAM 的管理。 堆、栈和静态区 针对于 Cortex M3 内核的单片机的详细内存分配可以参照笔者的这篇文章 STM3

weixin_42616791的博客 1544

MTK 内存管理

MTK 手机用的操作系统是 nucleus, 这是一个rtfs(实时操作系统),这个rtfs本身是不带内存管理功能,所以MTK自己写的内存管理。(nucleus在系统初始化完毕时,会调用Application_Initialize,参数就是可使用内存的起始地址)大体上来分,MTK内存可以分为3种:control buffer  平常使用的OslMalloc就是这个内存。 这个内存内部实现是按块来划分的(pool),具体的配置可以custom_config.c 文件里的custom_config_ctrl_b

dy_Learning的专栏 3853

关于Buffer的问题 C++之GetBuffer函数详解

简直就是弱爆了,原来所谓的buffer是抽象的呀 buffer就是系统分配给用户的一块数据存储单元,和变量其实是一样的呀,omyga!用于暂时存储用户数据 这个函数是为一个CString对象重新获取其内部字符缓冲区的指针,返回的LPTSTR为非const的,从而允许直接修改CString中的内容! 如果nMinBufLength 比当前buffer大,那么就调用ReleaseBuffer函数去

berry666的专栏 1万+

MTK内存动态申请释放

1. OslMalloc OslMfree 为一个般的程序分配内存,用来保存一般性的数据,效率高,不能分配太大内存,else程序会挂掉 2. media_get_ext_buffer  media_free_ext_buffer 可以分配较大内存,与OslMalloc 有着数量级区别,比如读一个比较大的文件操作时,要分配的buffer就要这个 ,这个不是在堆上分配的,和寄存器有关系 3. gui_

feelinghappy的专栏 3178

【STM32】内存管理

内存管理,是指软件运行时对MCU内存资源的分配和使用的技术。如何高效、快速的分配,并且在适当的时候释放和回收内存资源**内存使用三部曲:内存申请(分配)内存使用内存释放malloc[用于内存的申请]和free[用于内存的释放]标准的C语言库也提供了mallow函数和free函数来实现动态申请和释放内存。那为啥我们不用C语言库的呢?原因如下:占用大量的代码空间 不适合在资源紧缺的嵌入式系统当中没有线程安全的相关机制运行有不确定性,每次调用这些函数时花费的时间可能都不一样内存碎片化。

m0_73409202的博客 2534

【FreeRTOS】内存管理

既分配又释放, heap_4在heap_2的基础上做了一些改进,heap_4合并相邻的空闲内存针对heap_2的缺点,如果我们再想分配120字节的空间,那就是可以的了,因为buf1的100字节和buf2的50字节合并起来了!

weixin_63135906的博客 2246

【Windows内存管理内存管理

内存管理,外部碎片,内部碎片,缺页中断,页面置换算法

2301_79461609的博客 1390

LWIP内存管理

LWIP协议栈中使用了两种主要的内存管理方法,动态内存池和动态内存堆。LwIP 也支持 C 标准库的 malloc() 和 free(),但是容易产生内存碎片,不建议使用,可以在lwipopt.h中配置。

qq_35337506的博客 1551

Linux内存管理

Glibc 的 malloc 可以支持多线程,增加了非主分配区(non main arena)支持,主分配区与非主分配区用环形链表进行管理。每一个分配区利用互斥锁(mutex)使线程对于该分配区的访问互斥。每个进程只有一个主分配区,但可能存在多个非主分配区,ptmalloc 根据系统对分配区的争用情况动态增加非主分配区的数量,分配区的数量一旦增加,就不会再减少了。主分配区可以访问进程的 heap 区域和 mmap 映射区域,也就是说主分配区可以使用 sbrk 和 mmap向操作系统申请虚拟内存。

weixin_45673259的博客 1802

Golang 的内存管理

页堆是内存分配的核心结构体,Go 语言程序会将其作为全局变量存储,而堆上初始化的所有对象都由该结构体统一管理,该结构体中包含两组非常重要的字段,其中一个是全局的中心缓存列表 central,另一个是管理堆区内存区域的 arenas 以及相关字段。微分配器只会用于分配非指针类型的内存,上述三个字段中 tiny 会指向堆中的一片内存,tinyoffset 是下一个空闲内存所在的偏移量,最后的 tinyAllocs 会记录内存分配器中分配的对象个数。Go 的内存分配器会根据申请分配的内存大小选择不同的处理逻辑。

Doublelv 的博客专栏。 2491

GetBuffer, ReleaseBuffer, GetBufferSetLength的用法

GetBuffer和ReleaseBuffer是一套需要配合使用的函数, 与GetBufferSetLength相比, 优点是如果分配的空间大于实际保存的字符串(0结尾), ReleaseBuffer会把多余申请的空间释放, 归还给系统; 但使用时需要注意以下问题: 如果要保存的字符串为abc(0结尾), 则GetBuffer参数应至少为3; 如果要保存的内容不是以0结尾, 比如是读取文件数...

mikasoi的博客 1742

ADS1.2下载地址

        网页:http://www.mcu123.com/down/view.asp?id=39           下载:http://esoft.mcu123.com/MCU123_temp_0080309@/ARM/ads1.2.rar 用迅雷下载http://www.21ic.org/down/arm/ads1.2.rar

将总结养成一种习惯 1万+

MTK 中的NVRAM读写操作指南

Nvram操作说明Nvram性质和文件一样,不过,对它进行读写数据,在手机格式化后还存在。1, 在Nvram_user_defs.h的 nvram_lid_cust_enum中添加自定义的lid名称可以用类似格式:NVRAM_MY_DATA_BYTE_ID2,在这个文件中定义一个lid的size和total.           #define NVRAM_MY_DATA_SIZE     512

将总结养成一种习惯 8269

ADS1.2的安装之license文件

首先建立一个记事本文档,命名为license.txt,再修改属性为.dat,即为license.dat,内容如下:## Generated on 2009-jun-2 by licwizard#PACKAGE ads armlmd 1.200 E32F0DE5161D COMPONENTS="armasm compiler bats armulate axd adwu fromelf arml

将总结养成一种习惯 3890

MTK编译错误解决?

tools//make.exe: *** [.//tst//database_classb//BPLGUInfoCustomSrc] Error 1在编译Bin时,刚开始编译就提示错误。解决从下面的几个方面:1。option.mak里的ads路径是否正确。注意这里必须要用短文件名才行,如c://program file//arm//adsv_12必须写成c://progra~1//ar

将总结养成一种习惯 2338
上一篇: Makefile概述
下一篇: mtk 中 nvram 的读写操作
nie_feilong
博客等级 码龄18年 43粉丝 81原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值