首页 > 其他分享 >自整理2.23版本下的malloc和free流程

自整理2.23版本下的malloc和free流程

时间:2024-03-01 23:13:17浏览次数:22  
标签:bin malloc unsortedbin chunk free topchunk 2.23 fastbin

''''malloc流程:

1.如果处于mmap的范围,直接调用mmap分配

2.如果所需分配内存在fastbin的范围里会在fastbin里查找空闲的合适大小的chunk,如找到则结束。

3.如果所需分配的内存在smallbin的范围里,就去smallbin里查找,如找到则结束。

4.如果所需分配的内存不在smallbin里(也就是大于0x400),那么就会先尝试合并fastbin里的chunk(注意合并条件需要chunk相邻)并放入到unsorted bin准备接下去的工作(没有合并也会被放入unsortedbin)

5.在unsorted bin里查找last_remainder是否大于等于所需分配内存的chunk,如果大于,就分割出来将小地址的那块chunk使用,剩下的高地址的chunk作为新的last_remainder(依旧是在unsortedbin里),如果刚好的大小chunk,则会直接将其使用;如果last_remainder小于所需分配内存的chunk,就会先把此chunk放入 small/large bin 中去,然后去遍历其他在unsortedbin里的chunk,从链表的尾部(也就是循着bk指针)开始遍历,也就是FIFO先进先出(除了fastbin和tcachebin是LIFO:后进先出,其他bin遍历chunk都是从尾部指针开始遍历),如果有刚好的大小chunk,则会直接将其使用,并终止遍历,如果此chunk小于或大于所需分配内存,就会先把此chunk放入 small/large bin 中去,接着再重复循环下一个chunk,直至找到精确大小的chunk或找完所有unsortedbin中的chunk就会结束循环

在unsortedbin当中,若malloc(0x80),当链表中没有0x90size的chunk,则size为0xa0的freechunk也会被拿去给malloc使用,但是其他bin不行。

6.根据所申请的chunk的大小在small bin或large bin中循着bk指针搜索第一个大于等于所需空间的chunk(如果是大于的话则会进行切块操作,切下剩余的如果大于 MINSIZE就会被放入unsortedbin里当作last_remainder)

7.若topchunk空间足够则使用topchunk分配

8.若topchunk空间不足,则将旧的所剩无几的topchunk放入unsortedbin里,进行新的内存块申请,分配新的topchunk,然后再由新的topchunk分配(这种情况下一般是topchunk已经被多次分配而导致变为很小了,所以需要重新申请一块topchunk)

free流程:

1.如果free的空间是由mmap分配的(也就是ISMMAP 位为1),则直接归还操作系统

2.如果free的chunk在fastbin的范围内,放入fast bin,结束(以下合并操作不会进行,就算此chunk相邻topchunk也不会合并,tcachebin也一样)

3.如果物理相邻的前一个chunk(远离topchunk的)是free(并且不是fastbin里的)的,将前面的chunk合并,并且将两个chunk的size相加覆盖两个chunk中低地址的chunk的size以及修改低地址的chunk的fd和bk指针。然后放入unsorted bin,执行unlink

4.如果后一个chunk是top chunk,则将当前chunk(经过步骤2的合并也一样会)并入top chunk

5.如果后一个chunk是free的(并且不是fastbin里的),将后面的chunk合并,并且将两个chunk的size相加覆盖两个chunk中低地址的chunk的size以及修改低地址的chunk的fd和bk指针。然后放入unsorted bin,执行unlink

6.前后chunk都不是free的,放入unsorted bin

free之后的chunk第一时间只会进入unsortedbin或者fastbin,直到malloc之后才可能会进入到smallbin或其他bin

fastbin的chunk的下一个chunk的PREV_INUSE位始终为1,也就是说fastbin里chunk始终不会合并,但是可以通过某些漏洞强制修改下一个chunk的PREV_INUSE位为0,接着再释放临近范围不在fastbin或tcachebin(因为释放满足这两个bin范围的chunk不会进行合并操作)的chunk使其合并

标签:bin,malloc,unsortedbin,chunk,free,topchunk,2.23,fastbin
From: https://www.cnblogs.com/fusan/p/18048141

相关文章

  • 2.23页面制作3
    !DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>合理性审查</title><style>.reSet{background-color:#4CAF50;color:white;border:......
  • test2024.2.23
    圣诞树题意:用\(m\)种颜色的彩球装点\(n\)层的圣诞树。圣诞树的第\(i\)层恰由\(l_{i}\)个彩球串成一行,且同一层内的相邻彩球颜色不同,同时相邻两层所使用彩球的颜色集合不同。求有多少种装点方案。\(n,m\le10^6,1\lel_{i}\le3\times10^3,\suml_{i}\le10^7\)。......
  • new vs malloc
    https://www.cnblogs.com/qg-whz/p/5140930.html1、申请内存位置new操作符从自由存储区(freestore)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中......
  • 近期总结 2024.2.23
    dp专场。CF1784EInfiniteGame题意:一个由a和b构成的字符串\(s\),长度为\(n\)。两个人Alice和Bob在玩游戏,第\(i\)场中如果\(s_{(i-1)\bmodn+1}\)为a则Alice赢,否则Bob赢。两人遵循三局两胜原则:每当一个人胜场满两场时,称那个人赢了一轮,然后清空胜场记录开始......
  • 闲话2.23
    哎我怎么打galgame忘了时间了。昨天回来,真几把唐啊我草。回来之后qq寄大了......
  • 南外集训 2024.2.23 T3
    Kubic素质如此,如何国家队?有一个初始为空的序列,对其进行\(q\)次操作(强制在线)。操作分为两种:\(1\;x\)表示在序列末尾插入一个\(x\)。\(2\;x\)表示询问当前序列中长度等于\(x\)的区间的价值之和\(\bmod998244353\)。定义一个区间的价值为中前\(m\)大的数的乘......
  • 2.23测试
    T1:绑腿跑题目描述HZOI有N个小盆友,每天他们都会按同样的站位顺序进行各项体育活动。一天,HZOI的首领决定组织一个“绑腿跑”的比赛。为了安全起见,首领会从他们当前的队列中选出一个连续的区间来进行这个比赛。但是,众所周知,如果参加比赛的小盆友要玩得开心,而且安全的话,那么参......
  • 2.23读《构建之法》有感
    《构建之法》是一本由乔尔·斯泰恩编写的计算机科学领域的经典之作。在这本书中,斯泰恩深入探讨了软件开发的核心原则和技术方法,以及构建高质量软件系统的实践指南。阅读完《构建之法》后,我对软件开发有了更深入的理解,并获得了以下几点感悟:1.模块化与抽象化的重要性:书中强调了将......
  • AtCoder WTF 2019 B Multiple of Nine/南外集训 2024.2.23 T1
    给定\(q\)个区间\(\{[l_i,r_i]\}\),计算满足条件的长度为\(n\)的十进制数码串\(S\)的个数\(\bmod10^9+7\):\(\foralli\in[1,q],num(S[l_i,r_i])\equiv0\pmod9\)。其中\(num(T)\)表示数码串\(T\)代表的整数,\(T[a,b]\)表示子串\(T_aT_{a+1}\dotsT_b\)......
  • C++动态内存分配探秘:new与malloc的关键差异及实例解析
     概述:在C++中,new和malloc均用于动态内存分配,但存在关键差异。new是C++运算符,能调用构造函数,返回类型明确;而malloc是C函数,仅分配内存,需手动类型转换。示例源代码生动演示了它们在构造函数调用和类型信息方面的不同。在C++中,new 和 malloc 都用于动态内存分配,但它们之间......