美文网首页
二.内存分配

二.内存分配

作者: wit_yuan | 来源:发表于2019-02-26 22:39 被阅读0次

1.内存分配的简单说明

在基本的嵌入式rtos系统中,推荐使用的内存分配算法是tlsf。在gcc中,使用的是ptmalloc。

tlsf分配算法文档的链接地址:传送门
tlfs分配算法的代码链接地址:传送门
关于tlsf的分配算法,相关的doc文档:传送门

note:关于LP64与LLP64,有一链接可以供参考:传送门

2. tlsf分析

在tlfs中使用了一些架构相关的判断,其实是编译器内置的一些宏定义。

#if defined (__alpha__) || defined (__ia64__) || defined (__x86_64__) \
    || defined (_WIN64) || defined (__LP64__) || defined (__LLP64__)
#define TLSF_64BIT
#endif

另外就是编译器相关的情况:

#if defined (__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) \
    && defined (__GNUC_PATCHLEVEL__)
    printf("gnu tech...\r\n");
#elif defined (_MSC_VER) && (_MSC_VER >= 1400) && (defined (_M_IX86) || defined (_M_X64))
    printf("_MSC_VER...\r\n");
#elif defined (_MSC_VER) && defined (_M_PPC)
    printf("_MSC_VER _M_PPC. ..\r\n");
#elif defined (__ARMCC_VERSION)
    printf("__ARMCC_VERSION. ..\r\n");
#elif defined (__ghs__)
    printf("__ghs__. ..\r\n");
#else
    printf("else artch...\r\n");
#endif

另外,关于几个gcc内置的函数,介绍一下:

__builtin_clz(x) :表示x前导0的个数。x=0时结果未定义。

所以下面的代码,就比较容易理解了:

tlsf_decl int tlsf_ffs(unsigned int word)
{
    const unsigned int reverse = word & (~word + 1);
    const int bit = 32 - __builtin_clz(reverse);
    return bit - 1;
}

它做的事情很简单,就是log2(word)。

关于tlsf的内存划分:

总的缓冲池大小为:2097152字节。
pool_bytes,也就是真正的数据区大小为:2097152-6536-16=2090600。

control_t的内存大小为:32+4+425+2532*8=6536
目前在本主机上的内存块起始位置为:0x40b040
故可知control_t的内存位置为:0x40b040
block_header_t的内存位置为:0x40b040+6536-8=0x40c9c0,减去了8是因为block_header_t的prev_phys_block成员不使用,这样可以节省内存占用。

这就相当于内存区间为:control_t ---> block_header_t ---> pool.

如果是第一次申请一个534字节的数据,它会对齐到536,然后剩下的区块:remaining地址为:block_header_t的地址+8+内存大小=0x40c9c8+536=0x40cbe0。
remain_size=pool_bytes-536-8=2090056。

tlsf维护的是一个空闲表结构。它其实是将申请的块返回给用户,由用户来处理该块信息。

结构体名 基地址 长度 备注
control_t 0x40b040 6536 0x40c9c8
block_header_t 0x40c9c0 在control_t少8字节后面,因为 prev_phys_block不使用

以后被占用的空间只保留block_header_t的size部分,而其prev_phys_block被其余部分占用了。

相关文章

  • (二)C语言之动态内存分配

    (二)C语言之动态内存分配 一、静态内存分配 定义是指定分配的内存长度就是静态内存分配,是在栈内存中分配 二、C语...

  • 内存管理:部分基础知识

    一、内存分区二、常用数据类型占用内存大小三、给对象分配内存 1、给结构体分配内存及内存对齐 2、内存分配完后,内存...

  • 二.内存分配

    1.内存分配的简单说明 在基本的嵌入式rtos系统中,推荐使用的内存分配算法是tlsf。在gcc中,使用的是ptm...

  • HashMap 源码问答

    问题一:HashMap 初始化分配内存了吗? 问题二:HashMap 什么时候分配的内存?第一次分配了多少? 问题...

  • 《C语言》malloc函数使用

    动态分配、静态分配 静态分配:计算机随机自动分配内存,周期结束后自动释放内存动态分配:手动分配内存,手动释放内存 ...

  • Go 内存管理 -- 内存分配 二

    接上一篇,下面来看看内存分配的初始化、分配等。 初始化 首先会申请一段连续的内存空间以供使用,大小(64位机器上)...

  • javascript内存管理

    内存声明周期 分配你所需要的内存 使用分配的内存(读写) 不再需要时释放内存 内存分配 javascript在声明...

  • docker 的资源分配

    内存分配 -m 或者--memory :分配内存--memory-swap:分配临时内存docker run -i...

  • Java中四种引用

    Java内存管理包括内存分配和内存回收。 内存分配:程序员通过new对象,JVM会自动为该对象分配内存。 内存回收...

  • Java编程语言:java中四种引用!欢迎补充

    Java内存管理包括内存分配和内存回收。 内存分配:程序员通过new对象,JVM会自动为该对象分配内存。 内存回收...

网友评论

      本文标题:二.内存分配

      本文链接:https://www.haomeiwen.com/subject/ivfzyqtx.html