glibc下malloc的理解

浅析基于glibcmalloc 最近看了几个malloc和free的问题,总结一下。 malloc和free由谁提供? 一般来讲,它们是C Standard Library提供的而不是由操作系统的内核实现。例如微软的是msvcrt,Linux下是glibc。当然也有第三方库函数,比如jemalloc、tcmalloc。所以每个malloc和free的实现都有所不同,而且这些实现和内核之间是保留有一定自由度的。比如每次mall 阅读详情

0.1 简介

在linux中常见的malloc是glibc的malloc,经对glibc上malloc修改有适用于linux多线程的mallocdlmalloc,还有一个ptmalloc2这两者有区别,其区别在于:

dlmalloc 在子线程和父线程同时调用malloc时会有竞争,且只会有一个能够从heap中分配到空间。并且freelist data structure 是被众进程共享的。

ptmalloc2 可以确保不有这种竞争,而且freelist 是各自进程独享自己的一个结构体。ptmalloc是per thread malloc之意。


1.malloc用例

/* Per thread arena example. */
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>

void* threadFunc(void* arg) {
        printf("Before malloc in thread 1\n");
        getchar();
        char* addr = (char*) malloc(1000);
        printf("After malloc and before free in thread 1\n");
        getchar();
        free(addr);
        printf("After free in thread 1\n");
        getchar();
}

int main() {
        pthread_t t1;
        void* s;
        int ret;
        char* addr;

        printf("Welcome to per thread arena example::%d\n",getpid());
        printf("Before malloc in main thread\n");
        getchar();
        addr = (char*) malloc(1000);
        printf("After malloc and before free in main thread\n");
        getchar();
        free(addr);
        printf("After free in main thread\n");
        getchar();
        ret = pthread_create(&t1, NULL, threadFunc, NULL);
        if(ret)
        {
                printf("Thread creation error\n");
                return -1;
        }
        ret = pthread_join(t1, &s);
        if(ret)
        {
                printf("Thread join error\n");
                return -1;
        }
        return 0;
}
情景1

main threadmalloc之前

sploitfun@sploitfun-VirtualBox:~/ptmalloc.ppt/mthread$ ./mthread 
Welcome to per thread arena example::6501
Before malloc in main thread
...
sploitfun@sploitfun-VirtualBox:~/ptmalloc.ppt/mthread$ cat /proc/6501/maps
08048000-08049000 r-xp 00000000 08:01 539625   /home/sploitfun/ptmalloc.ppt/mthread/mthread
08049000-0804a000 r--p 00000000 08:01 539625   /home/sploitfun/ptmalloc.ppt/mthread/mthread
0804a000-0804b000 rw-p 00001000 08:01 539625   /home/sploitfun/ptmalloc.ppt/mthread/mthread
b7e05000-b7e07000 rw-p 00000000 00:00 0 

再未用malloc时,尚未分配heap

情景2
sploitfun@sploitfun-VirtualBox:~/ptmalloc.ppt/mthread$ 
Linuxglibc内存管理 整理的参考文献,记不清了 1 背景简介 出现疑似”内存泄露”问题: malloc申请的内存,free释放以后没有归还操作系统,比如内存模块占用的内存为10GB,释放内存以后,通过TOP命令或者/proc/pid/status查看占用的内存有时仍然为10G,有时为5G,有时为3G, etc,内存释放的行为不确定。 2 malloc()/free(), mmap(), brk() 阅读详情

相关推荐

阅读glibcmalloc源码理解-chunk结构理解

拿32位程序来举例子,每个程序都有自己专属的4GB的虚拟空间,我们写的C代码在这个4GB空间中是有明确分布的,详情可以参考我另外一篇博客32位内存布局。我们看到一个chunk的开始其实是chunk指针指向的位置,其实这个叫chunk头,我们使用malloc申请内存的时候,会返回一个指针给我们那个指针就是我图中画的返回给用户的指针是指向用户数据。chunk头对用户来说是透明的,只有操作系统知道。接着是下一个chunk。学过操作系统的都知道,我们的内存是存在分页机制的,将内存划分为一个一个4kb的页框来管理。

qq_30528603的博客 751

glibc下的内存管理

glibc下的内存管理 几周前我曾提到,我被项目组分配去做了一些探究linux下内存管理机制的活儿。因为我们的产品遇到了一些与之相关的“诡异”问题。这些问题以及相关情况可以概括如下: 先介绍一下相关的背景。由于我们是3D软件,所以用户经常会有“导入/导出”各种geometry的需求。而一个存储这些数据的文件,可能含有不止一个geo...

weixin_30443895的博客 535

【信创-k8s】银河麒麟V10国防版+鲲鹏/飞腾(arm64架构)在线/离线部署k8s1.30+kubesphere

银河麒麟作为国家核高基专项的重要成果,国防版凭借其卓越的安全性和可靠性,已成为军工领域的首选操作系统。之前我们在适配麒麟V4国防版的过程中已发现诸多安全性要求,而麒麟V10国防版在安全防护等级上又达到了更高的级别。本文将主要演示离线部署,因为军工项目基本不会出现联网场景。即使在线,也可以按离线方式部署,且离线部署由于有私有仓库,不会存在镜像获取不到和丢失情况。

jiaworld的博客 704

glibcmalloc的详细解释

原文地址:http://blog.csdn.net/eroswang/article/details/4130972 应用程序是从0x8048000开始,那是由linker定的,具体数值在一linker脚本定的,具 体在哪忘了,只在linux上是这样,到其它的平台上,可能就是另外一个值了,这只是个约定。0x804a008到0x8048000之间是程序 的.text,.data,.bss等内容。

yang_chen_shi_wo的博客 582

glibcmalloc()的空间overhead

linux下调用malloc()分配内存的时候,实际占用的内存与请求的内存尺寸的关系是什么呢,这个需要研究一下glibcmalloc()的实现。现在常见linux发行版中带的glibc中采用的都是Doug Lea的实现,下面的分析取自他的2.8.4版本的malloc.c。 glibc对内存的管理是以chunk为单位的,未分配的chunk之间用双向链表连接成一个环,遍历的时候用指针遍历,已分配的chunk在其首部有chunk的大小,并以此字节数做遍历。每个chunk的首部要放置一个叫做malloc_ch

莫问收获,但问耕耘 590

理解 glibc malloc

理解 glibc malloc堆内存是一个很有意思的领域,这样的问题: 堆内存是如何从内核中分配的? 内存管理效率怎样? 它是由内核、库函数,还是应用本身管理的? 堆内存可以开发吗?我也困惑了很久,但是直到最近我才有时间去了解它。下面就让我来谈谈我的研究成果。开源社区提供了很多现成的内存分配器(memory allocators ):dlmalloc – General purpos...

zsj2102的专栏 531

深入理解 glibc malloc

新一葛格 · 2015/06/15 10:180x00 前言近期的在看 pwn 的一些东西,发现无论是实际场景中,还是 CTF 中,堆的利用越来越多,又由于各种环境下堆的实现都不太一样,因此就让皂皂翻译这篇文章, 我也对本文作了润色修改,以飨读者。原文:https://sploitfun.wordpress.com/2015/02/10/understanding-glibc-malloc/com...

weixin_33962923的博客 492

理解 glibc malloc:主流用户态内存分配器实现原理

本篇文章主要完成了对《Understanding glibc malloc》的翻译工作。限于本人翻译水平与专业技术水平(纯粹为了了解内存分配而翻),本文章必定会有很多不足之处,请大家见谅,也欢迎大家的指正! 联系邮箱:974985526@qq.com。

猫科龙 2万+

理解 glibc mallocmalloc() 与 free() 原理图解

本文分为三个等级自顶向下地分析了glibc中内存分配与回收的过程。本文不过度关注细节,因此只是分别从arena层次、bin层次、chunk层次进行图解,而不涉及有关指针的具体操作。前言 Arena级分析 main arena中的内存申请 thread arena中的申请 内存回收 bin级分析 内存回收 内存分配 chunk级分析前言在展开本文之前,先解释一下本文中会提到的三个重要概念:arena,

猫科龙 1万+

关于如何理解Glibc堆管理器(Ⅷ——从源代码理解malloc)

本篇实为个人笔记,可能存在些许错误;若各位师傅发现哪里存在错误,还望指正。感激不尽。 若有图片及文稿引用,将在本篇结尾处著名来源(也有置于篇首的情况)。 关于glibc堆管理器Ptmalloc2的实际讨论在前几节已经大致结束了,但是笔者仍觉得对其分配机制缺少完整的认识,于是最后两节将直接通过源代码来对其分配和释放规则进行分析 尽管笔者所用的Ubuntu18.04使用glibc-2.27,但笔者在对照源代码后发现,实际的操作和官方放出的glibc2.29更加接近,因此...

Tokameine的博客 1881

关于如何理解Glibc堆管理器(Ⅹ——完结、补充、注释——Arena、heap_info、malloc_*)

本篇实为个人笔记,可能存在些许错误;若各位师傅发现哪里存在错误,还望指正。感激不尽。 若有图片及文稿引用,将在本篇结尾处著名来源(也有置于篇首的情况)。 截至到本节内容,该系列算是正式完结了,后续或许会有补充,但基本上都将添加在本节内容中。在前几节中,笔者已经按照自己的思路尽可能详尽的将Glibc的堆管理器Ptmalloc2的方式做了一定的介绍,尽管Ptmalloc2的内容肯定不止这些,但已能大致了解其工作方式了 但也有一些必要的内容未曾在前几节中放出,诸如突然出现...

Tokameine的博客 1386

终极指南:深入理解glibc malloc与tcache机制的核心原理与漏洞利用

CTF-All-In-One是CTF竞赛的权威指南,其中对glibc内存分配机制的深入解析为安全研究者和CTF选手提供了宝贵的知识。本文将带你全面掌握glibc malloc的底层实现与tcache机制的安全漏洞,通过实例分析帮助你快速提升堆漏洞利用能力。 ## glibc malloc:内存分配的核心引擎 glibc(GNU C Library)作为Linux系统的核心组件,其malloc

gitblog_00199的博客 508

[c++][源码]glibc-1.09中malloc()源码、实现机制理解、与广泛流传版本的区别

库&文件 glibc-1.09、\glibc-1.09.1\malloc\malloc.c、\glibc-1.09.1\malloc\malloc.h. 源代码 malloc.h /* Declarations for `malloc' and friends. Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc. Written May 1989 by Mike Haertel. This librar

qq_43478653的博客 932

关于如何理解Glibc堆管理器(Ⅴ——从Large Bin Attack理解malloc对Bins的分配)

本篇实为个人笔记,可能存在些许错误;若各位师傅发现哪里存在错误,还望指正。感激不尽。 若有图片及文稿引用,将在本篇结尾处著名来源(也有置于篇首的情况)。 参考文章: 同样先引用如下两篇文章。如果读者能够通过如下三篇文章掌握Large Bin Attack,那么本篇便只是附带品,没有什么其他内容 https://dangokyo.me/2018/04/07/a-revisit-to-large-bin-in-glibc/ https://ctf...

Tokameine的博客 882

深入理解 glibc malloc:内存分配器实现原理

译者:猫科龙 链接:https://blog.csdn.net/maokelong95/article/details/51989081前言堆内存(Heap Memory)是一个很有意思的...

关注微信公众号【开源Linux】,后台回复『10T』,领取10T学习资源大放送,涵盖Linux、虚拟化、容器、云计算、网络、Python、Go等书籍和视频 600

计算机工作原理_计算机系统篇之虚拟内存(8):理解 glibc malloc 的工作原理(上)...

计算机系统篇之虚拟内存(8):理解 glibc malloc 的工作原理(上)Author: stormQCreated: Wednesday, 18. November 2020 07:50PMLast Modified: Wednesday, 25. November 2020 10:49PM目录√动态内存分配简介√堆在进程虚拟地址空间中的分布√堆顶可以“顶”到哪√初探 malloc...

weixin_40005542的博客 284

glibcmalloc与free的实现原理(四):tcache机制

glibcmalloc与free的实现原理(四): tcache 一、概述 tcache是glibc某个版本后引入的新机制,目的是提高堆管理的性能。 事实上,在我们现在用pwndbg调试与堆有关的程序时,就会发现许多free chunk被归入了tcache 许多漏洞的利用也和tcache机制有关,因此研究tcache的机制是有必要的。 我们先不论tcache机制到底是什么(按照字面意思,有“高速缓存”之意),先就从tcache相关的新增代码的分析入手,最后就能总结出tcache机制究竟是什么。 二、新的相

weixin_44215692的博客 3127

ESP-IDF 5.4下esp32-camera组件编译报错?手把手教你解决头文件缺失问题

本文详细解析了ESP-IDF 5.4环境下esp32-camera组件编译时出现的头文件缺失问题,提供了从目录结构优化、CMake配置到VSCode智能感知设置的完整解决方案。针对第三方组件集成难题,文章特别强调了PRIV_REQUIRES依赖声明和路径配置的关键作用,帮助开发者高效解决编译错误并建立稳定的开发环境。

weixin_28829629的博客 280

android mqtt客户端源码,可以安装直接使用

android mqtt客户端源码,可以安装直接使用,bin目录下面有*apk 安装即可,并可以结合服务端Mosquitto 畅快使用学习研究

上一篇: 完全公平调度-cfs
MIThebut
博客等级 码龄14年 3粉丝 3原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值