
Heap
文章平均质量分 83
cccsy97
这个作者很懒,什么都没留下…
展开
-
堆内存(8)——内存释放函数_int_free
_int_free 在_lib_free中得知如果一个chunk不是由mmap分配得到,就会调用_int_free进行释放。void __libc_free(void *mem) {...p = mem2chunk(mem);if (chunk_is_mmapped(p)){ ...}ar_ptr = arena_for_chunk(p);_int_free(ar_ptr, p, 0);}第一部分static void_int_free (mstate av, mch原创 2022-03-14 09:41:50 · 1913 阅读 · 0 评论 -
堆内存(5)——系统调用MMAP、MUMAP
MMAPmmap 声明mmap/munmap函数声明如下:#include <sys/mman.h>void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);int munmap(void *addr, size_t length);addr:如果不为NULL,内核会在此地址创建映射;否则,内核会选择一个合适的虚拟地址。length:表示映原创 2022-03-11 09:39:14 · 2014 阅读 · 0 评论 -
堆内存(7)——内存释放入口函数_lib_free
_libc_freevoid__libc_free (void *mem){ mstate ar_ptr; mchunkptr p; /* chunk corresponding to mem */ void (*hook) (void *, const void *) = atomic_forced_read (__free_hook); if (__builtin_expect (hook != NULL, 0))原创 2022-03-11 09:41:38 · 685 阅读 · 0 评论 -
堆内存(6)——MORECORE宏
MORECORE宏MORECORE是一个宏定义,其最终是通过系统调用分配内存,定义在linux内核的mmap.c文件中,SYSCALL_DEFINE1(brk, unsigned long, brk){ unsigned long retval; unsigned long newbrk, oldbrk; struct mm_struct *mm = current->mm; unsigned long min_brk; bool populate;原创 2022-03-11 09:40:22 · 427 阅读 · 0 评论 -
堆内存(4)——向操作系统申请内存sysmalloc
向操作系统申请内存sysmallocsysmalloc流程图尝试mmap分配try_mmap如果空间用完static void * sysmalloc(INTERNAL_SIZE_T nb, mstate av) { //声明结构体 ..... if (av == NULL || ((unsigned long) (nb) >= (unsigned long) (mp_.mmap_threshold) && (mp_原创 2022-03-11 09:36:21 · 1917 阅读 · 0 评论 -
堆内存(3)——分配函数_int_malloc
_int_malloc__libc_malloc会调用malloc_hook_ini 进行初始化,然后回调__libc_malloc函数,这时候会执行_int_malloc开始分配内存//堆内存分配入口函数static void *_int_malloc (mstate av, size_t bytes){ ...... //将内存转换以块为单位,并判断内存大小是否合法 if (!checked_request2size (bytes, &nb)) {原创 2022-03-11 09:34:00 · 1868 阅读 · 0 评论 -
堆内存(2) ——分配入口__lib_malloc
__libc_mallocmalloc的入口函数为__libc_malloc其流程图如下首先遍历fastbin和small bin,希望从中分到chunk。如果没有找到堆块,接下来就开始合并到fastbin中的堆块,合并完添加到unsorted bin中,然后进入到大循环。进入到大循环的路径有两个:1、请求堆块为large chunk。2、small bin中对应的bin为空1、将unsorted bin里面所有的chunk都添加到small bin和large bin里面去。走到大循环这一步,原创 2022-03-11 09:30:42 · 1083 阅读 · 0 评论 -
堆内存(1) - ptmalloc2分配器
ptmalloc2分配器ptmalloc2 分配给用户的内存都以 chunk 来表示,可以理解为 chunk 为分配释放内存的载体。下面根据glibc2.31对ptmalloc进行了分析。malloc_chunkmalloc_chunk用于管理内存块,该结构体维护了一张已使用和未使用内存块的链表struct malloc_chunk { INTERNAL_SIZE_T mchunk_prev_size; /* Size of previous chunk, if it is fre原创 2022-03-11 09:29:14 · 829 阅读 · 0 评论