内存管理

来源:互联网 发布:linux rpm包下载网站 编辑:程序博客网 时间:2024/06/05 18:08
(1)malloc函数用于内存申请,free函数用于内存释放。(2)内存管理表的项值代表的意义:当该项值为0的时候,代表对应的内存块未被占用,当该项值非零的时候,代表该项对应的内存块已经被占用,其数值则代表被连续占用的内存块数。**比如某项值为10,那么说明包括本项对应的内存块在内,总共分配了10个内存块给外部的某个指针。**![这里写图片描述](http://img.blog.csdn.net/20170805164001225?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzg4MDAwODk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)(3)内寸分配方向:是从顶底的分配方向。即首先从最末端开始找空内存。当内存管理刚初始化的时候,内存管理表全部清零,表示没有任何内存块被占用。(4)分块式内存管理——分配原理    当指针p调用malloc申请内存的时候,先判断p要分配的内存块数(m),然后从第n项开始,向下查找,直到找到m块连续的空内存块(即对应内存管理表项为0),然后将这m个内存管理表项的值都设置为m(标记被占用),最后,把最后的这个空内存块的地址返回指针p,完成一次分配。注意,如果当内存不够的时候(找到最后也没找到连续的m块空闲内存),则返回NULL给p,表示分配失败。(5)分块式内存管理——释放原理    当指针p申请的内存用完,需要释放的时候,调用free函数实现。free函数先判断p指向的内存地址所对应的内存块,然后找到对应的内存管理表项目,得到p所占用的内存块数目m(内存管理表项目的值就是所分配内存块的数目),将这m个内存管理表项目的值都清零,标记释放,完成一次内存释放。(6)//内存管理控制器struct _m_mallco_dev

{
void (*init)(u8); //初始化
u8 (*perused)(u8); //内存使用率
u8 *membase[SRAMBANK]; //内存池 管理SRAMBANK个区域的内存
u16 *memmap[SRAMBANK]; //内存管理状态表
u8 memrdy[SRAMBANK]; //内存管理是否就绪
};
extern struct _m_mallco_dev mallco_dev;//在mallco.c里面定义
nit,函数指针,指向内存初始化函数,用于初始化内存管理,带一个参数(Mini板不带)
,表示要初始化的内存片。
perused,函数指针,指向内存使用率函数,用于获取内存使用率,,带一个参数(Mini板不带),表示要获取内存使用率的内存片。
membase,内存池指针,指向内存池。最多有SRAMBANK个内存池(Mini板仅一个)。
memmap,内存管理表指针,指向内存管理表。最多有SRAMBANK个内存管理表(Mini板仅一个)。该指针为16位类型,因此,最大可以分配65535(可申请的

内存块数)*内存块这么大的内存区域。
假定内存块大小为32字节,那么一次性最大可以申请的内存就是2M-32字节。
memrdy,内存管理表就绪标志,用于表示内存管理表是否已经初始化(清零)。最多有
SRAMBANK个内存管理表就绪标志(Mini板仅一个)。
(7)
这里写图片描述
这里写图片描述
内存中几个概念,1 内存块大小-一个内存块有多少个字节,2 内存表大小–有多少个内存表(一个内存块对应一个内存表),3最大管理内存=内存表大小*内存块大小

原创粉丝点击