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掉大页面文件。

posted @ 2025-03-30 16:11  yghr  阅读(26)  评论(0)    收藏  举报