dpdk helloworld代码分析


 argc,  **= (ret <  

 

程序的流程如下图所示:

 

 

代码首先初始化了Environment Abstraction Layer(EAL),EAL主要提供了以下功能

 multi-process and multi-//de-/

 

num_pages

 argc,  ** rte_atomic32_t run_once = RTE_ATOMIC32_INIT( shared_driver *solib =  *
     (!rte_atomic32_test_and_set(& -= strrchr(argv[], = strdup(logid ? logid + : argv[= (rte_eal_log_early_init() < 
     (rte_eal_cpu_init() < = (fctret < 
     (internal_config.no_hugetlbfs ==  &&!= RTE_PROC_SECONDARY &&==  &&< 
     (internal_config.memory ==  && internal_config.force_sockets == == (internal_config.vmware_tsc_map == = 
                
                
     (rte_eal_iopl_init() == |=
     (rte_eal_pci_init() <  (rte_eal_ivshmem_init() < 

    
     (rte_eal_memory_init() < 
     (rte_eal_memzone_init() < 
     (rte_eal_tailqs_init() <  (rte_eal_ivshmem_obj_init() < 

     (rte_eal_log_init(logid, internal_config.syslog_facility) < 
     (rte_eal_alarm_init() < 
     (rte_eal_intr_init() < 
     (rte_eal_timer_init() < 
     (rte_eal_non_pci_ethdev_init() < &->lib_handle = dlopen(solib-> ((solib->lib_handle == NULL) && (solib->name[] != 
            (sopath), , solib->->lib_handle = (solib->lib_handle ==
         (pipe(lcore_config[i].pipe_master2slave) <  (pipe(lcore_config[i].pipe_slave2master) < == pthread_create(& (ret != 
    

 

下面主要分析一下内存的初始化过程

 

对于process type是PRIMARY的调用rte_eal_hugepage_init; SECONDARY的调用rte_eal_hugepage_attach;


  retval = rte_eal_process_type() == RTE_PROC_PRIMARY ? (retval <  - (internal_config.no_shconf ==  && rte_eal_memdevice_init() <  - 

 


  rte_mem_config * hugepage_file *hugepage, *tmp_hp = nr_hugefiles, nr_hugepages =  *, = rte_eal_get_configuration()->
    =->memseg[].phys_addr =->memseg[].addr =->memseg[].len =->memseg[].socket_id = 
    
         (rte_xen_dom0_memory_init() <  -
             
     (i = ; i < () internal_config.num_hugepage_sizes; i++=+= internal_config.hugepage_info[i].num_pages[
    = malloc(nr_hugepages * ( (tmp_hp ==, nr_hugepages * (= ; 

    
     (i = ; i < ()internal_config.num_hugepage_sizes; i ++ hugepage_info *= & (hpi->num_pages[] == 
        
         (map_all_hugepages(&tmp_hp[hp_offset], hpi, ) < ->hugepage_sz / 
        
         (find_physaddrs(&tmp_hp[hp_offset], hpi) < ->hugepage_sz / 
         (find_numasocket(&tmp_hp[hp_offset], hpi) < ->hugepage_sz / 
         (sort_by_physaddr(&tmp_hp[hp_offset], hpi) < = remap_all_hugepages(& (new_pages_count[i] < ->hugepage_sz / +=
        
        
         (map_all_hugepages(&tmp_hp[hp_offset], hpi, ) < ->hugepage_sz / 
        
         (unmap_all_hugepages_orig(&tmp_hp[hp_offset], hpi) < += hpi->num_pages[=  (i = ; i < () internal_config.num_hugepage_sizes; i+++==

    
    
     (i = ; i < () internal_config.num_hugepage_sizes; i++ (j = ; j < RTE_MAX_NUMA_NODES; j++= 
    
     (i = ; i < nr_hugefiles; i++ socket =
         (j = ; j < () internal_config.num_hugepage_sizes; j++ (tmp_hp[i].size ==+=++
     (i = ; i < RTE_MAX_NUMA_NODES; i++=
    =
     (nr_hugepages < 
     (i = ; i < () internal_config.num_hugepage_sizes; i++ (j = ; j < RTE_MAX_NUMA_NODES; j++ (used_hp[i].num_pages[j] > 
                        / 
    =* ( (hugepage ==, nr_hugefiles * (
    
    < 
    
    < =
     (j = ; j < RTE_MAX_MEMSEG; j++ (mcfg->memseg[j].addr ==-- (i = ; i < nr_hugefiles; i++= 
         (i == =   (hugepage[i].socket_id != hugepage[i-=   (hugepage[i].size != hugepage[i-=   ((hugepage[i].physaddr - hugepage[i-].physaddr) !==   (((unsigned )hugepage[i].final_va -)hugepage[i-].final_va) !== 
        +=  (j ==->memseg[j].phys_addr =->memseg[j].addr =->memseg[j].len = hugepage[i].size *->memseg[j].len =->memseg[j].socket_id =->memseg[j].hugepage_sz =
        ->memseg[j].len += mcfg->= (i <
            
            
            
             (-  -

相关内容