说明
这一篇文章主要是对DPDK的EAL(Environment Abstraction Layer)中内存管理和分配的解析,这是DPDK中ring, mempool, mbuf等的基础。
由于个人水平所限,若所写的博文中存在错误,希望大家能帮忙指出。
一,DPDK的内存模式
DPDK存在两种内存模式:
1, legacy mode : 这一种为静态内存模式,即在初始化过程就根据配置分配所有的内存,并且这些内存页在application结束之前
不会归还给OS;而且也不会再向OS申请更多的内存。并且application使用DPDK的rte_malloc库申请内存时,若剩余可用的内存不足,则
直接返回错误。这种模式的优点是若一段内存空间的虚拟内存地址是连续的,那么其物理内存地址也是连续的。
2, dynamic mode:这一种为动态内存模式,在初始化过程根据配置分配所需要的内存,并且这些内存页在application结束之前不会
归还给OS。若application使用DPDK的rte_malloc库申请内存时,若剩余可用的内存不足,则会先向操作系统申请内存,再将这些内存分配
给application。由于会动态地向OS申请内存,所以虚拟内存连续并不意味着物理内存连续。
(对于向操作系统动态申请的内存,在application释放这些内存时,DPDK系统会将其归还给OS,不必等到application结束)
二,相关结构体的说明
下面,先对一些结构体的字段进行说明(参考后面的图例能更容易的理解),能够帮助对后面的理解:
**********************************malloc_elem.h*****************************
struct malloc_elem {
struct malloc_heap *heap;
struct malloc_elem *volatile prev; //指向上一个malloc_elem
/**< points to prev elem in memseg */
struct malloc_elem *volatile next; // 指向下一个malloc_elem
/**< points to next elem in memseg */
LIST_ENTRY(malloc_elem) free_list; //指向下一个free malloc_elem
/**< list of free elements in heap */
struct rte_memseg_list *msl;
volatile enum elem_state state; //表明malloc_elem的状态: free, 或者busy
uint32_t pad; //填充无效的内存区域
size_t size; // 表示malloc_elem所表示的内存区域的大小(包含struct malloc_elem), 以字节为单位
struct malloc_elem *orig_elem; //指向最初的malloc_elem(即内