LiteOS之内存管理

来源:互联网 发布:淘宝账号解封成功案例 编辑:程序博客网 时间:2024/06/05 08:42
LiteOS的内存支持静态分配、动态分配两种,亦即BOX和DLINK算法,类似字节块和字节池的差异,静态分配方式中存储空间大小一致,而动态分配可以使用变化大小的存储空间。
一、BOX分配方式
BOX算法中内存块的大小是由初始化的时刻固定的。提供magic赋值方式用于内存检查,即在每块申请空间前一个word用于填写固定值的方式检查内存破坏情况。
1、使用结构体
LOS_MEMBOX_INFO只是在连续存储空间开始作为头信息
typedef struct{   UINT32           uwBlkSize;                            /**<Block size*/         块大小   UINT32           uwBlkNum;                             /**<Block number*/ 块个数   LOS_MEMBOX_NODE  stFreeList;                 /**<Free list*/        维护可申请空闲内存的地址链表} LOS_MEMBOX_INFO;//LOS_MEMBOX_NODE 用来链接节点地址的链表typedef struct tagMEMBOX_NODE{    struct tagMEMBOX_NODE *pstNext;            /**节点链表指针*/} LOS_MEMBOX_NODE;
2、初始化
一块连续存储空间,经过BOX算法初始化函数初始化后,结构形式如下:


hedaer即为LOS_MEMBOX_INFO的信息,包含块大小、个数及可使用内存块链表的头结点。block1-n的大小相同,均为LOS_MEMBOX_INFO中uwBlkSize大小。在初始化时,没个存储空间块的头地址作为结点链表地址,即作为tagMEMBOX_NODE指针使用,来维护链表。
3、申请
使用malloc申请时,从空闲内存块链表中得到一个block,并返回相应地址,同时删除相应链表节点。如下连续申请两个内存块的情况:

注意malloc返回的地址1和2并不完全等同于block1、2的起始地址,取决于是否在block块开始部分占用存储空间用于内存检查。
4、释放
释放时,将相应释放的内存块加入空闲链表。

二、DLINK分配方式
DLINK分配算法中,用户可以根据需求申请可变大小的存储空间,相对于box方式,更灵活,但维护也相对复杂些。没有完全研究所有代码,说说自己的理解。
1、使用结构体
文档提供的结构图,实现包含三个部分,第一部分是整体的memory的地址及大小;第二部是一个链表的表头数组,对应着空闲的不同大小的存储空间链表表头;第三部分是可以申请的存储空间及其头信息。

使用的结构体大致包括
typedef struct{    VOID *pPoolAddr;                        /**<Starting address of a memory pool  */    UINT32 uwPoolSize;                      /**<Memory pool size    */} LOS_MEM_POOL_INFO;typedef struct{    LOS_DL_LIST stListHead[OS_MULTI_DLNK_NUM];} LOS_MULTIPLE_DLNK_HEAD;typedef struct tagLOS_MEM_DYN_NODE{    LOS_DL_LIST stFreeNodeInfo;             /**对应大小的链表指针  */    struct tagLOS_MEM_DYN_NODE *pstPreNode;    /**指向相邻地址的前一个地址*/    UINT32 uwSizeAndFlag;                   /*大小及标志位,包括使用、对齐等标志位*/}LOS_MEM_DYN_NODE;
2、初始化
理解上DLNK模式下,初始化只生成一整块可用的memory。

3、申请
申请memory时,需要找到合适大小的存储空间进行分配,而大的地址空间可以拆分成不同的地址空间。在DLNK链表头节点只表示一定范围存储空间大小,所以在每个node中还需记录具体准确的存储大小。
例如,顺序申请A、B、C空间,理解上用户可用大小为A总大小减去node header即LOS_MEM_DYN_NODE的大小:

4、释放
释放时需要将可用空间放入相应空闲列表,可以将连续小的存储片合并成更大的可用空间。在目前的结构上,当前空间的前一个分配空间地址可以通过LOS_MEM_DYN_NODE中的pstPreNode得到,而后一个地址通过uwSizeAndFlag含有的size大小,与node的起始地址运算可得。
如释放B再释放A的过程:

LOS_MULTIPLE_DLNK_HEAD的作用,主要是对不同大小范围的分片memory通过链表级联起来,
如A、B、C、D一样大小

原创粉丝点击