文档首页 > > 开发指南> 内核开发指南> 内存> 动态内存> 开发指导

开发指导

分享
更新时间: 2018/12/16 GMT+08:00

使用场景

内存管理的主要工作是动态的划分并管理用户分配好的内存区间。

动态内存管理主要是在用户需要使用大小不等的内存块的场景中使用。

当用户需要分配内存时,可以通过操作系统的动态内存申请函数索取指定大小内存块,一旦使用完毕,通过动态内存释放函数归还所占用内存,使之可以重复使用。

功能

Huawei LiteOS系统中的动态内存管理模块为用户提供下面几种功能,具体的API详见接口手册。

功能分类

接口名

描述

内存初始化

LOS_MemInit

初始化一块指定的动态内存池,大小为size。

申请动态内存

LOS_MemAlloc

从指定动态内存池中申请size长度的内存。

释放动态内存

LOS_MemFree

释放已申请的内存。

重新申请内存

LOS_MemRealloc

按size大小重新分配内存块,并保留原内存块内容。

内存对齐分配

LOS_MemAllocAlign

从指定动态内存池中申请长度为size且地址按boundary字节对齐的内存。

分析内存池状态

LOS_MemStatisticsGet

获取指定内存池的统计信息

查看内存池中最大可用空闲块

LOS_MemGetMaxFreeBlkSize

获取指定内存池的最大可用空闲块

DLINK开发流程

  1. 配置:

    OS_SYS_MEM_ADDR:系统动态内存池起始地址,一般不需要修改

    OS_SYS_MEM_SIZE:系统动态内存池大小,以byte为单位,系统默认分配DDR后未使用的空间

    LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK:内存越界检测开关,默认关闭。打开后,每次申请动态内存时执行动态内存块越界检查;每次释放静态内存时执行静态内存块越界检查。

  2. 初始化LOS_MemInit。

    初始一个内存池后如图,生成一个 EndNode,并且剩余的内存全部被标记为

    FreeNode节点。注:EndNode作为内存池末尾的节点,size为0。

  3. 申请任意大小的动态内存LOS_MemAlloc。

    判断动态内存池中是否存在申请量大小的空间,若存在,则划出一块内存块,以指针形式返回,若不存在,返回NULL。

    调用三次LOS_MemAlloc函数可以创建三个节点,假设名称分别为UsedA,UsedB,UsedC,大小分别为sizeA,sizeB,sizeC。因为刚初始化内存池的时候只有一个大的FreeNode,所以这些内存块是从这个FreeNode中切割出来的。

    当内存池中存在多个FreeNode的时候进行malloc,将会适配最合适大小的FreeNode用来新建内存块,减少内存碎片。若新建的内存块不等于被使用的FreeNode的大小,则在新建内存块后,多余的内存又会被标记为一个新的FreeNode。

  4. 释放动态内存LOS_MemFree。

    回收内存块,供下一次使用。

    假设调用LOS_MemFree释放内存块UsedB,则会回收内存块UsedB,并且将其标记为FreeNode

BEST LITTLE开发流程

1. 配置:

OS_SYS_MEM_ADDR:系统动态内存池起始地址,需要用户指定

OS_SYS_MEM_SIZE:系统动态内存池大小,以byte为单位,需要用户正确计算

LOSCFG_MEMORY_BESTFIT:置为YES,选中内存管理算法中的BESTFIT算法

LOSCFG_KERNEL_MEM_SLAB:置为YES,打开内存管理中的SLAB机制

SLAB_MEM_COUNT:该配置位于内核中,一般不需要改动,表示SLAB CLASS的数量,目前内核初始化为4。

SLAB_MEM_ALLOCATOR_SIZE:该配置位于内核中,一般不需要改动,表示每个SLAB CLASS的最大可分配的块的总空间。

SLAB_BASIC_NEED_SIZE:该配置位于内核中,一般不需要改动,表示初始化SLAB机制时需要的最小的堆空间。如果改动了SLAB_MEM_COUNT和SLAB_MEM_ALLOCATOR_SIZE的配置,就需要同步改动这个配置。

2. 初始化:

调用LOS_MemInit函数初始化用户指定的动态内存池,若用户使能了SLAB机制并且内存池中的可分配内存大于SLAB需要的最小内存,则会进一步初始化SLAB CLASS

3. 申请任意大小的动态内存:

调用LOS_MemAlloc函数从指定的内存池中申请指定大小的内存块,申请时内存管理先向SLAB CLASS申请,申请失败后继续向堆内存空间申请,最后将申请结果返回给用户。在向堆内存空间申请时,会存在内存块的切分。

4. 释放动态内存:

调用LOS_MemFree函数向指定的动态内存池释放指定的内存块,释放时会先判断该内存块是否属于SLAB CLASS,若属于,则将该内存块还回SLAB CLASS。否则,向堆内存空间释放内存块。在向堆内存空间释放时,会存在内存块的合并。

平台差异性

无。

分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

跳转到云社区