1 rte_eal_malloc_heap_init
先给malloc_heaps中的name字段赋上名字,每个socket一个heap,本例中只有一个socket id = 0;
2 rte_memseg_contig_walk(malloc_add_seg, NULL)
对每个memseg list做处理,把memseg加入到heap中。由于4个memseg list中的count都是0,所以这里都continue跳过了,打断点没有断住。
3 总结
在这里的处理中,基本没什么操作,只是对rte_config->mem_config->malloc_heaps的name字段赋值了,但是malloc_heaps这个概念在dpdk中非常重要。其结构体如下,管理malloc_elem的free链表,最多可管理13条链表。dpdk上层的内存申请,都是基于heaps。
/**
* Structure to hold malloc heap
*/
struct malloc_heap {
rte_spinlock_t lock;
LIST_HEAD(, malloc_elem) free_head[RTE_HEAP_NUM_FREELISTS];
struct malloc_elem *volatile first;
struct malloc_elem *volatile last;
unsigned alloc_count;
unsigned int socket_id;
size_t total_size;
char name[RTE_HEAP_NAME_MAX_LEN];
} __rte_cache_aligned;
#define RTE_HEAP_NUM_FREELISTS 13
malloc_elem 的结构体如下,关联了对应的memseg list,同时关联了该malloc elem所在的malloc heap,也关联了heaps中对应的free element链。
struct malloc_elem {
struct malloc_heap *heap;
struct malloc_elem *volatile prev; /**< points to prev elem in memseg */
struct malloc_elem *volatile next; /**< points to next elem in memseg */
LIST_ENTRY(malloc_elem) free_list; /**< list of free elements in heap */
struct rte_memseg_list *msl;
volatile enum elem_state state;
uint32_t pad;
size_t size;
uint64_t header_cookie;
} __rte_cache_aligned;
关于malloc heap和malloc element,以及和memseg list/memseg之间如何管理,还需要深入研究。