博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ucos-II 内存管理源码分析
阅读量:6315 次
发布时间:2019-06-22

本文共 2217 字,大约阅读时间需要 7 分钟。

ucos-II的内存管理提供了对某块完整内存的修改,功能非常简单NBNC的代码大概只有200多行,在整个内核中也基本是独立的。它通过如下方式对内存块进行管理:

OS_MEM *mem;INT8U buff[16][128];void main(void){    INT8U err;     mem = OSMemCreate(&buff[0][0],16,128,&err);  }

下文分析os_mem.c文件,从全局变量的定义与接口函数的实现两方面记录ucos-II的内存管理机制。

1. MEM的全局变量

OS_EXT  OS_MEM *OSMemFreeList; /* Pointer to free list of memory partitions       */OS_EXT  OS_MEM OSMemTbl[OS_MAX_MEM_PART]; /* Storage for memory partition manager            */

上面两个全局变量在内核初始化中由OS_MemInit初始,用户试图进行管理的一个内存块,如上例中的buff,对应内核中的一个OS_MEM资源,OS_MEM结构体定义如下:

typedef struct { /* MEMORY CONTROL BLOCK                                     */    void   *OSMemAddr; /* Pointer to beginning of memory partition           */    void   *OSMemFreeList; /* Pointer to list of free memory blocks          */    INT32U  OSMemBlkSize; /* Size (in bytes) of each block of memory             */    INT32U  OSMemNBlks;  /* Total number of blocks in this partition             */    INT32U  OSMemNFree;  /* Number of memory blocks remaining in this partition  */} OS_MEM;

2. MEM的接口函数

  1. 建立内存分区OSMemCreate:在该函数中一个空闲的OS_MEM资源通过OSMemFreeList被获取,同时这个内存分区内的内存块被初始化为一个起始地址是OSMemAddr的链表。我认为这个链表的定义是非常巧妙的,当前节点的值存储下一个节点的地址,一次类推,代码如下(映像中linux内核中的万用链表也是类似的机制):
plink = (void **)addr;  //addr是内存分区的起始地址、blksize是内存分区中每个内存块的大小               pblk  = (INT8U *)addr + blksize;    for (i = 0; i < (nblks - 1); i++) {        *plink = (void *)pblk; //相当于把pNext的地址复制给pCur的值        plink  = (void **)pblk;        pblk   = pblk + blksize;    }    *plink              = (void *)0;                     pmem->OSMemAddr     = addr;                           pmem->OSMemFreeList = addr;

     2. 主要接口函数诸如获取一个内存块或者释放一个内存块,都是对上述链表的操作。但由于链表的定义,链表的插入和删除变得很简单。例如返回一个内存块给内存分区:

*(void **)pblk      = pmem->OSMemFreeList; //把当前的pFree作为pBlk的值     pmem->OSMemFreeList = pblk;//pblk赋值给pFree    pmem->OSMemNFree++;  返回前:pData -> OSMemFreeList(old), 返回后: pData -> pblk -> OSMemFreeList(Old); pblk成为当前的OSMemFreeList(New)

获取一个内存块给内存分区:

pblk                = pmem->OSMemFreeList; //当前空节点的地址返回     pmem->OSMemFreeList = *(void **)pblk; //当前空节点的值(即pNext)赋值给OSMemFreeList           pmem->OSMemNFree--;

其他:OS_MEM_DATA 定义了一个内存块的信息,在OSMemQuery中使用,没有特别的意义。

 

 

转载于:https://www.cnblogs.com/Fredric-2013/archive/2013/01/24/2874601.html

你可能感兴趣的文章
接口和抽象类有什么区别
查看>>
zzzzw_在线考试系统①准备篇
查看>>
剑指offer第二版-1.赋值运算符函数
查看>>
Android学习笔记——文件路径(/mnt/sdcard/...)、Uri(content://media/external/...)学习
查看>>
Echart:前端很好的数据图表展现工具+demo
查看>>
Linux VNC黑屏(转)
查看>>
Java反射简介
查看>>
day8--socket网络编程进阶
查看>>
node mysql模块写入中文字符时的乱码问题
查看>>
分析Ajax爬取今日头条街拍美图
查看>>
内存分布简视图
查看>>
如何学习虚拟现实技术vr? vr初级入门教程开始
查看>>
第4 章序列的应用
查看>>
初识闭包
查看>>
hdu1874畅通工程续
查看>>
rails 字符串 转化为 html
查看>>
java-学习8
查看>>
AOP动态代理
查看>>
Yii2.0 下的 load() 方法的使用
查看>>
华为畅玩5 (CUN-AL00) 刷入第三方twrp Recovery 及 root
查看>>