本文共 1804 字,大约阅读时间需要 6 分钟。
malloc 系统 分为两部分 board_init_f 过程中 malloc的初始化和消费者 board_init_r 过程中 malloc的初始化和消费者
board_init_f initf_malloc common/dlmalloc.c gd->malloc_limit = 0x100000; gd->malloc_ptr = 0; reserve_malloc common/board_f.c gd->start_addr_sp = reserve_stack_aligned((1024*1024));---board_init_r initr_reloc gd->flags |= GD_FLG_RELOC | GD_FLG_FULL_MALLOC_INIT; initr_malloc common/board_r.c malloc_start = gd->relocaddr - TOTAL_MALLOC_LEN; mem_malloc_init common/dlmalloc.c mem_malloc_start = start; mem_malloc_end = start + size; mem_malloc_brk = start; memset((void *)mem_malloc_start, 0x0, size); malloc_bin_reloc(); // null可以看到每一套malloc 的初始化 都只是初始化了一些全局变量,划分了一部分内存用于malloc并没有将 这部分内存 进行初始化管理,例如 malloc 内存的分区 和 相关数据结构的初始化
消费者都调用 malloc 进行内存分配, common/dlmalloc.c L1273 中定义了 mallocVoid_t* mALLOc(size_t bytes)L918 # define mALLOc malloc
board_init_f 过程中malloc common/dlmalloc.c if (!(gd->flags & GD_FLG_FULL_MALLOC_INIT)) malloc_simple(bytes); common/malloc_simple.c alloc_simple(bytes, 1); common/malloc_simple.c addr = ALIGN(gd->malloc_base + gd->malloc_ptr, align); new_ptr = addr + bytes - gd->malloc_base; ptr = map_sysmem(addr, bytes); gd->malloc_ptr = ALIGN(new_ptr, sizeof(new_ptr)); 总结 : 看起来是很简单的malloc // 从 为 malloc 分配的内存空间,最低位置开始分配 // 不断的往上堆积 被 malloc 的空间malloc nb = request2size(bytes); common/dlmalloc.c if (is_small_request(nb)){ common/dlmalloc.c // do something }else{ // do simething }
第一套的消费者 initf_dm -> dm_init_and_scan -> dm_init -> device_bind_by_name -> device_bind_common -> calloc(common/dlmalloc.c) -> malloc第二套的消费者 initr_dm -> dm_init_and_scan -> dm_init -> device_bind_by_name -> device_bind_common -> calloc(common/dlmalloc.c) -> malloc
转载地址:http://ebigi.baihongyu.com/