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. 用 eclipse SVN 插件共享项目
  2. 5.3.1 TCP协议特点和TCP报文段格式
  3. cmd常见错误及解决方法
  4. 移动端— position: fixed;固定定位解决方案
  5. 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点...
  6. Method.invoke 异常捕获
  7. 【图表】java 24年发展历史及长期支持jdk版本(up to 2020.04)
  8. centos7搭建Linux集群,CentOS 7下Kafka集群安装
  9. 蛋疼的中文编码及其计算机编码历史
  10. 改变你一生命运的话语 不得不信
  11. VBS去除指定的字符串中的重复项返回重复后的字符串
  12. LINUX SHELL多条件(与、或)if判断怎么写?
  13. 安卓root后查看WiFi密码
  14. Mesh Slicer 切割人体的原理分析
  15. 2019.08.12【NOIP提高组】模拟 A 组
  16. 有偿调查问卷赚钱攻略
  17. 18、弱电工程综合布线系统常用的线材及设备图文资料
  18. kali使用笔记本自带无线网卡_不会选无线网卡看过来!再也不花冤枉钱了.........
  19. acwing-小猫爬山
  20. 如何用pdf转jpg软件将pdf转换成图片

热门文章

  1. JavaEE5 Jax-ws 学习(Soap webservice)
  2. svg图片在vue脚手架vue-cli怎么使用
  3. nodejs(6)express学习
  4. 洛谷.4897.[模板]最小割树(Dinic)
  5. Linq distinct去重方法之一
  6. hibernate的二级缓存
  7. Java读书笔记(4)-多线程(二)
  8. 用sed或awk输出一段文字
  9. PHP__call __callStatic
  10. wpf控件设计时支持(3)