前言
《深入浅出DPDK》 2.7.4章节介绍大页内存使用方法如下:
#echo > 1024 /sys/kernel/mm/hugepages/hupages-2048KB/nr_hugepages
#mkdir /mnt/huge
#mount -t hugetlbfs nodev /mnt/huge
DPDK程序运行时,会使用mmap ()系统调用把大野映射到用户态的虚拟地址空间,然后就可正常使用了。
本文通过源码分析DPDK在初始化过程中针对大页内存这一块进行的处理细节。
DPDK Version: 17.11.2
Date:2018-06-18, Created by HRG
正文
代码流程主要分两块,1、获取用户的大页内存配置;2、根据配置初始化并映射相关的大页内存
eal.c rte_eal_init()
primary进程调用eal_hugepage_info_init函数,获取用户配置的大页大小和页数。
if (internal_config.no_hugetlbfs == 0 &&
internal_config.process_type != RTE_PROC_SECONDARY &&
eal_hugepage_info_init() < 0) {
rte_eal_init_alert("Cannot get hugepage information.");
rte_errno = EACCES;
rte_atomic32_clear(&run_once);
return -1;
}
初始化内存模块,这里实现了大页内存到用户空间的映射,后面进程就可以正常使用大页内存了。
if (rte_eal_memory_init() < 0) {
rte_eal_init_alert("Cannot init memory\n");
rte_errno = ENOMEM;
return -1;
}
eal_hugepage_info.c eal_hugepage_info_init()
最多支持3种大小的Page:2M、4M、1G ?忘了在哪段代码看到了,具体哪三个不记得了。
//本函数参照下面这个命令进行说明
//echo > 1024 /sys/kernel/mm/hugepages/hupages-2048KB/nr_hugepages
//打开用户echo配置对应的路径
//static const char sys_dir_path[] = "/sys/kernel/mm/hugepages";
dir = opendir(sys_dir_path);
//循环读取路径名,因为用户可能echo了多次配置了多种大页大小
for (dir