dpdk内存初始化流程记录
rte_eal_init只是初始化mcfg中的数据结构,并未关联到对应的大页内存
rte_eal_init
eal_hugepage_info_init
"/sys/kernel/mm/hugepages"
"/dev/hugepages"
/var/run/dpdk/rte/hugepage_info
rte_eal_memzone_init: mcfg->memzones
rte_fbarray_init
"/var/run/dpdk/rte/fbarray_memzone"
rte_eal_memory_init
rte_eal_memseg_init: 设置RLIMIT_NOFILE为最大值
memseg_primary_init: mcfg->memsegs
alloc_memseg_list:
rte_fbarray_init: mls->memseg_arr, "memseg-{page_sz}k-{socket_id}-{type_msl_idx}"
alloc_va_space: mmap一块n_segs * 大页内存大小的匿名内存, 设置msl->addr上
eal_memalloc_init
rte_memseg_list_walk
rte_memseg_list_walk_thread_unsafe
fd_list_create_walk
alloc_list: rte_memseg_list下标, msl->memseg_arr.len, 将msl的信息保持到fd_list, 并初始化了n_segs的int数组保证到fd_list[list_idx].fds中
rte_eal_hugepage_init
eal_hugepage_init
calc_num_pages_per_socket
rte_eal_memdevice_init: mem_config->nchannel, mem_config->nrank
rte_eal_malloc_heap_init: 设置mcfg->malloc_heaps[i].name(socket_%d), mcfg->malloc_heaps[i].socket_id
register_mp_requests: handle_request
rte_memseg_contig_walk
rte_memseg_contig_walk_thread_unsafe
malloc_add_seg: 把memseg加入malloc_heaps对应的free_head链表中
rte_eal_timer_init: eal_timer_source = EAL_TIMER_TSC
set_tsc_freq
eal_check_mem_on_local_socket
rte_memseg_list_walk
rte_memseg_list_walk_thread_unsafe
check_socket
关注方法
实际大页只有在分配内存时才会触发分配
rte_memzone_reverse: 底层也是利用到malloc_heap_alloc
rte_malloc
rte_malloc
rte_malloc -> rte_malloc_socket -> malloc_heap_alloc -> malloc_heap_alloc_on_heap_id -> heap_alloc
malloc_heap_alloc_on_heap_id
heap_alloc
find_suitable_element
malloc_elem_alloc
split_elem
alloc_more_mem_on_socket
try_expand_heap
try_expand_heap_primary
alloc_pages_on_heap
eal_memalloc_alloc_seg_bulk
rte_memseg_list_walk_thread_unsafe
alloc_seg_walk
alloc_seg
malloc_heap_add_memory
heap_alloc
rte_free: 如果整块内存都释放了,会unmap掉大页面文件。