Lwbt的mem分配是通过一个大的字节数组memp_memory来派发的。在这个数组中规定了哪一段是属于哪个类型的,这样做的方法不是很科学,是通过规定各个类型结构的最大能用的个数来取的。Hci_pcb的个数就一个。memp_num数组中的元素就是每个类型的最大可用个数。而memp_sizes数组中的元素是每个类型的大小。memp_tab数组中的元素则是每个类型分配内存的第一个可用空间指针。
 
       Size(memp_memory[type]) =  memp_sizes[type] * memp_num[type]
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 
首先来看下memp这个结构体的定义:
struct memp
{
  struct memp *next;
};
它只有一个指向下一个结构的指针。同时注意到memp_tab数组中的元素都是这个结构的指针。
在这个文条件中主要有3个函数:lwbt_memp_init;lwbt_memp_malloc;lwbt_memp_free。上面说过对个结构的内存分配都是从一个指定的数组中来分配的。
下面看下lwbt_memp_init的实现,从整体上来说,这个函数是把各个结构在memp_memory中的首地址赋值给memp_tab中的各对应元素。对于限制数大于1的情况,还要将该类型的各个实例的地址串接起来。说起来比较难理解一些。下面用图解的方式给出:
                      Memp_memory
上图中显现的是以hci_link的初始化作为实例,其中预分配的数目为4个。
 
       我们从图中看到了有链表的实现,但是在lwbt_memp_init中没有明显的字样提及到链表的。这个功能,这里暂且称为隐式链表。它的实现,是通过在分配多个连续块内存的时候,在每一块前加分一个指针大小的内存,并通过这个指针指向下一块内存的起始地址。
p_temp=p1; *p1=(int)p_temp+size(struct)+1;//这里架设了struct是以int对齐。
 
这个例子是一个普遍的更隐晦的实现(相对lwbt_memp_init),在lwbt_memp_init中的实现要明显一些,主要是通过了struct memp这个结构来替代了上面的p1,这样就更清楚了一些。
接着,在讲下malloc和free函数。通过上面对初始化函数的理解,这里,我们不难猜测这两个函数的实现:
malloc:通过类型从memp_tab数组中获取struct memp型指针,并将其next指针赋值给memp_tab[该类型]。相当于从隐式链表中删除节点。
free:通过类型将memp_tab[该类型]赋值给要回收的地址指针,即struct memp类型指针,的next指针,并将要回收的地址指针赋值给memp_tab[该类型]。相当向隐式链表中增加节点。
 
       不难看出memp_tab[该类型]一直都是指向该类型第一个可用的内存地址。
值得注意的是
malloc中:mem = MEM_ALIGN((u8_t *)memp + sizeof(struct memp));其中mem是函数返回的地址,这句话就是要将开头的struct memp(隐式链表节点信息)去掉,从真正的结构类型起始地址开始。
free中:memp = (struct memp *)((u8_t *)mem - sizeof(struct memp));其中mem是要回收的地址,这句话的意思与上面的相反,它是要加入隐式链表节点信息,以确保,memp_tab中隐式链表的正常运行。
Malloc:【第一个是已分配的】
Free:【memp_tab前面的两个都以分配,现在首要free第一个】

转载于:https://blog.51cto.com/bluefish/170130

lwbt的内存分配详解相关推荐

  1. spark on yarn 内存分配详解

    spark on yarn 内存分配详解

  2. 【C语言】动态内存分配详解

    目录 一.为什么有动态内存分配 二.动态内存分配函数 (1)malloc()函数 (2)calloc()函数 (3)realloc()函数 三.常见的动态内存错误 1.越界访问 2.内存泄漏 3.对N ...

  3. C语言动态内存分配详解

    文章目录 前言 一.为什么存在动态内存分配 1.已掌握的内存开辟方式 2.上述开辟空间方式的特点 3.为什么存在动态内存分配 二.动态内存函数的介绍 1.malloc 2.free 3.calloc ...

  4. 指针不显示 upupw_Go高级编程:指针和内存分配详解

    点击上方蓝色"Go语言中文网"关注我们,设个星标,每天学习 Go 语言 定义 了解指针之前,先讲一下什么是变量. 每当我们编写任何程序时,我们都需要在内存中存储一些数据/信息.数据 ...

  5. 内存分配详解 malloc, new, HeapAlloc, VirtualAlloc,GlobalAlloc

    很多地方都会使用内存,内存使用过程中操作不当就容易崩溃,无法运行程序,上网Google学习一下,了解整理下他们之间的区别以及使用 ,获益匪浅 0x01 各自的定义和理解 (1)先看GlobalAllo ...

  6. [转载] JAVA 堆栈 堆 方法区 静态区 final static 内存分配 详解

    参考链接: 在Java中为静态最终static final变量分配值 转载来源:https://blog.csdn.net/peterwin1987/article/details/7571808 J ...

  7. 计算机操作系统执行可执行程序时,内存分配详解

    处理器遇到的地址都是虚拟地址,虚拟地址和物理地址都分成页码(页框)和偏移量俩部分组成.在虚拟地址转换成物理地址的过程中,偏移值不变,而页码和页框码之间的映射就在一个映射记录表--页表中 当进程创建时, ...

  8. 【C++】动态内存分配详解(new/new[]和delete/delete[])

    原文链接:https://blog.csdn.net/qq_40416052/article/details/82493916 代码还是原文看着方便,在此不调整格式了 一.为什么需要动态内存分配? 在 ...

  9. C++内存分配详解四:std::alloc行为剖析

    侯捷C++内存分配课程总结四:std::alloc行为剖析 剖析标准的容器分配器的动作 文章内容参照于侯捷 C++内存分配系列教程 文章目录 侯捷C++内存分配课程总结四:std::alloc行为剖析 ...

最新文章

  1. 时间序列(三)滑动窗口
  2. php date 转换 string_php将时间差转换为字符串提示
  3. Effective Java之静态工厂代替构造器(一)
  4. Python守护进程和脚本单例运行
  5. postman 使用_Postman简单使用
  6. HTTP协议发展历程
  7. launchpad不用图标_Launchpad Manager,一款非常方便的启动台图标管理工具
  8. thinkphp5.0如何隐藏index.php入口文件
  9. 【Spark ML】第 3 章:监督学习
  10. tekton pipelineresource资源
  11. 百词斩不复习_百词斩是不是真的好用?
  12. Docker从基础到企业生产应用学习笔记大总结
  13. __stack_chk_fail问题及解决方案
  14. origin画图工具使用,去除注释的方框和图例的红色线框,x轴标注旋转
  15. Unity中的物体渲染顺序
  16. 重复照片查找软件Duplicate Photos Sweeper Mac
  17. 小游戏,利用Python爬虫之制作诗歌接龙
  18. 【转】C语言之四书五经
  19. 【C】牛客网 编程入门训练138道题
  20. 测试管理及项目测试流程

热门文章

  1. uwp选取文件夹并读取其中的图片
  2. requirejs使用笔记
  3. leetcode - Balanced Binary Tree
  4. String内存分配
  5. LeetCode-Add Two Numbers
  6. thinkingback no5
  7. python数据分析-数据准备
  8. 0428专题:行内元素与块状元素
  9. day08 MapReduce
  10. SpirngMVC通过Ajax传递多个对象