DPDK17.02内存管理3 – rte_eal_memzone_init

该函数初始化memzone子系统,将其置空。同时将前面初始化的连续大页初始化为malloc heap。

1、清除所有的memzone

2、调用 rte_eal_malloc_heap_init() 函数 初始化 malloc heap

3、调用 malloc_heap_add_memseg() 函数

将memseg添加到malloc heap中,每个NUMA node上包含一个 heap结构体,使我们可以根据线程运行所在的NUMA node,在对应的结点分配内存。

struct malloc_heap 结构体用来管理每个socket上的空闲空间。

如下图所示。

3.1 malloc_elem_init() 函数

该函数初始化连续内存的头部 struct malloc_elem 结构:

struct malloc_elem 结构体定义如下:

3.2 malloc_elem_mkend() 函数

该函数同样初始化一个 struct malloc_elem 结构,作为连续内存的尾部结构,并指向 start_elem:

调用完这两个函数后,其连续内存结构如下:

3.3 malloc_elem_free_list_insert(start_elem)

该函数按这部分 memseg 连续内存空间的大小,将其插入到对应的 elem->heap->free_head[idx] 中,即 mcfg->malloc_heaps[ms->socket_id]->elem->heap->free_head[idx] 链表中。

根据内存的大小,系统将其插入到对应的队列中,通过malloc_elem_free_list_index()函数将heaps中的malloc_elem元素按大小分为不同的组,分别为:

————————————————————

原创文章,转载请注明: 转载自孙希栋的博客

本文链接地址: 《DPDK17.02内存管理3 – rte_eal_memzone_init》

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注