内存初始化:
1、 映射文件总结
DPDK中,有两个核间共享的全局变量,分别是总内存配置信息和页表数组信息,系统中所
有核都可以对这两个全局变量进行访问,为了使每个核访问相同变量时的变量地址是一致
的,采用映射相同文件的方式来访问相同的变量地址。
总内存配置信息映射文件 /var/run/.rte_config
rte_config.mem_config 指向总内存配置信息,每个核通过映射 /var/run/.rte_config 文件来使
mem_config 指向相同的物理内存。用 struct rte_mem_config 结构来存储总内存配置信息,
其主要包括以下信息:
内 存 分 段 信 息 : 总 共 可 存 储 256 个 连 续 的 内 存 段 , 保 存 在 struct rte_memseg
memseg[RTE_MAX_MEMSEG];数组中。这个数组在运行过程中不会变化。
空闲内存段信息 free_memseg :这个一开始就是内存分段的信息, 随着运行过程中内存的使
用情况,这个信息会做相应的调整。
内存域数组 memzone :这个存储了系统中已分配的内存域,内存域从 free_memseg 中分配
得到,并按分配的先后顺序保存在这个数组中,每一个内存域有一个唯一的名字与其对应。
总共可存储 2560 个域。 rte_memzone 是 DPDK内存管理最终向客户程序提供的基础接口,
通过 ret_memzone_reverse 可以获取基于 DPDK HUGEPAGE的属于同一个物理 CPU的物理内
存连续且虚拟内存也连续的一块地址。 rte_ring/rte_malloc/rte_mempool 等组件就是依赖于
rte_memzone 组件实现的。
页表数组信息映射文件 /var/run/.rte_hugepage_info:
DPDK中,使用到的内存所对应的页用一个 Struct hugepage 表示,系统中会使用很多内存页,
把所有内存页的信息放到一个 Struct hugepage 结构数组进行管理,这里暂时把这个数据叫
做页表项数组吧!
保存页表项数据的内存也是采用共享内存形式,通过映射文件 /var/run/.rte_hugepage_info
来保证各核所访问的内存是相同的。
页表项信息记录了每一页所对应的物理地址、 虚拟地址、 该页的大小、 该页所属的 socket_id、
该页所挂载到的文件名称,等等。页表项信息结构如下:
struct hugepage {
void *orig_va; /**< virtual addr of first mmap() orig=1 时放在这里 */
void *final_va; /**< virtual addr of 2nd mmap() 虚拟开始地址 */
uint64_t physaddr; /**< physical addr 物理开始地址 */
size_t size; /**< the page size 该页的大小 */
int socket_id; /**< NUMA socket ID */
int file_id; /**< the '%d' in HUGEFILE_FMT 在 map_all_hugepages 时的顺序 */
/* 该页所属的内存段,一个内存段包含的页是相连续的 */
int memseg_id; /**< the memory segment to which page belongs */
/* 该大页缓存所挂载到的目录下的文件 */
char filepath[MAX_HUGEPAGE_PATH]; /*rtemap%s*< path to backing file on filesystem */
};
其中 orig_va 在初始化完内存之后全为 NULL,不再使用。
页挂载路径 /mn/huge/rtesmp_%fileid
由上述页表项信息结构知道,每一个页都挂载到 hugepage 文件系统中的一个文件中上,文
件路径名格式是: /mn/huge/rtesmp_%fileid