首页 > 其他分享 >malloc fastbin

malloc fastbin

时间:2022-11-21 16:11:38浏览次数:54  
标签:malloc chunk pp assert victim fastbin

首先定义了 REMOVE_FB

#define REMOVE_FB(fb, victim, pp)			\
do							\
{							\
victim = pp;					\
if (victim == NULL)				\
break;						\
pp = REVEAL_PTR (victim->fd);                                     \
if (__glibc_unlikely (pp != NULL && misaligned_chunk (pp)))       \
malloc_printerr ("malloc(): unaligned fastbin chunk detected"); \
}							\
while ((pp = catomic_compare_and_exchange_val_acq (fb, pp, victim)) \
!= victim);					\

这个宏函数在获取fastbin成功时,且为多线程时触发。其中fb为指向fastbinY数组中某一项的指针,victim为要返回的chunk的指针,pp为一个临时的chunk指针。

if ((unsigned long) (nb) <= (unsigned long) (get_max_fast ()))
  {
      idx = fastbin_index (nb);
      mfastbinptr *fb = &fastbin (av, idx);
      mchunkptr pp;
      victim = *fb;

fastbin分配的核心代码,其中nb为要分配的chunk大小,根据nb计算出对应的idx,根据idx获取fastbinY数组中某一项的指针fbfb指向一个chunk,最后victim也指向该chunk。

if (victim != NULL)
{
    if (__glibc_unlikely (misaligned_chunk (victim)))
          malloc_printerr ("malloc(): unaligned fastbin chunk detected 2");

    if (SINGLE_THREAD_P)
          *fb = REVEAL_PTR (victim->fd);
    else
          REMOVE_FB (fb, pp, victim);

如果找到了相应的chunk,也就是分配成功了。检查1:chunk是否是对齐的。然后将victim从链表中清除,将victim->fd存放到fastbinY数组里。这里考虑了多线程的问题。这里我们只看单线程的代码

#define PROTECT_PTR(pos, ptr) \
  ((__typeof (ptr)) ((((size_t) pos) >> 12) ^ ((size_t) ptr)))
#define REVEAL_PTR(ptr)  PROTECT_PTR (&ptr, ptr)

这里将&(victim->fd)右移12位(页面大小)与victim->fd异或,这是一个加密手段,对fd的后48位进行加密。x^x=00^x=x所以有x^x^x=x

if (__glibc_likely (victim != NULL))
      {
          size_t victim_idx = fastbin_index (chunksize (victim));
          if (__builtin_expect (victim_idx != idx, 0))
              malloc_printerr ("malloc(): memory corruption (fast)");

如果完成链表清除后,victim != NULL的话,检查2:取出的chunk是否与预期一致。

          check_remalloced_chunk (av, victim, nb);
          void *p = chunk2mem (victim);
	      alloc_perturb (p, bytes);
	      return p;
	    }
	}

这里check_remalloced_chunk对取出的chunk做一个检查,如果没问题的话就返回victim[2]给用户空间

static void
do_check_remalloced_chunk (mstate av, mchunkptr p, INTERNAL_SIZE_T s)
{
  INTERNAL_SIZE_T sz = chunksize_nomask (p) & ~(PREV_INUSE | NON_MAIN_ARENA);

  if (!chunk_is_mmapped (p))
    {
      assert (av == arena_for_chunk (p));
      if (chunk_main_arena (p))
        assert (av == &main_arena);
      else
        assert (av != &main_arena);
    }

  do_check_inuse_chunk (av, p);

  /* Legal size ... */
  assert ((sz & MALLOC_ALIGN_MASK) == 0);
  assert ((unsigned long) (sz) >= MINSIZE);
  /* ... and alignment */
  assert (aligned_OK (chunk2mem (p)));
  /* chunk is less than MINSIZE more than request */
  assert ((long) (sz) - (long) (s) >= 0);
  assert ((long) (sz) - (long) (s + MINSIZE) < 0);
}

主要是检查chunk的标志位是否正确

标签:malloc,chunk,pp,assert,victim,fastbin
From: https://www.cnblogs.com/f1by01/p/16911744.html

相关文章

  • malloc和new
    C语言中的malloc()和free()malloc//void*malloc(intsize);//malloc向系统申请分配指定size个字节的内存空间。返回类型是void*类型。void*表示未确定类型的指针。......
  • C语言将二进制文件写入内存malloc fopen fseek fread
    ///20221118malloc获取文件大小,并读取内存中///voidFuncation3(){//保存读入到内存中的结果//创建一个buffer,用来将打开的文件放入申请的内存中char*......
  • malloc的实现
    1、一篇文章彻底讲懂malloc的实现(ptmalloc):https://blog.csdn.net/songchuwang1868/article/details/899515432、Glibc内存管理-ptmalloc2:https://www.cnblogs.com/mysky0......
  • 嵌入式-C语言基础:malloc动态开辟内存空间
    #include<stdio.h>#include<stdlib.h>intmain(){//char*p;//定义一个野指针:没有让它指向一个变量的地址//*p='c';//直接对野指针进行操作,会报错ch......
  • C++——new和malloc的区别
    new是关键字/操作符,而malloc是函数new一个对象的时候,不但分配内存,而且还会调用类的构造函数(当然如果类没有构造函数,系统也没有给类生成构造函数,那没法调用构造函数了)......
  • 解决:ResourceWarning: Enable tracemalloc to get the object allocation traceback
    发现一个很有意思的事情:deftearDown(self):self.driver.close()会报错:/opt/homebrew/anaconda3/envs/Selenium/bin/python/Users/mokin.li/PycharmProje......
  • 记 malloc 奇怪的bug
    介绍写了一个项目,cpu+gpu,不可避免的遇到申请GPU的内存,申请CPU的内存,CPU上的数组,赋值来赋值去遇到了奇怪的bugmallocbugsmalloc():mismatchingnext->prev_si......
  • 在应用程序中替换Linux中Glibc的malloc的四种方法_转
    转自:在应用程序中替换Linux中Glibc的malloc的四种方法--csdn打算优化系统的内存分配,接管glibc提供的内存管理,但是整个工程的代码量很大,使用malloc、realloc、calloc和free......
  • kmalloc vmalloc
     kmalloc()、kzalloc()、vmalloc()的共同特点是:用于申请内核空间的内存;内存以字节为单位进行分配;所分配的内存虚拟地址上连续;kmalloc()、kzalloc()、vmalloc()的区别......
  • malloc与指针
    1错误写法#include<stdio.h>#include<stdlib.h>#defineMaxSize10//定义最大长度typedefstruct{intdata[10];//用静态的“数组”存放数据元素......