DPDK17.02内存管理1 – eal_hugepage_info_init
DPDK通过 eal_hugepage_info_init() 函数获得系统中大页的信息,保存在 internal_config->hugepage_info[i] 中。该结构体定义如下:
1 2 3 4 5 6 | struct hugepage_info { uint64_t hugepage_sz; /**< 大页的大小 */ const char *hugedir; /**< hugetlbfs 挂载的目录 */ uint32_t num_pages[RTE_MAX_NUMA_NODES]; /**< 当前大小的大页在每个SOCKET上的个数 */ int lock_descriptor; /**< 大页目录的文件描述述 */ }; |
该函数流程如下:
1、打开 /sys/kernel/mm/hugepages 目录,读取其中的每个目录名,得到大页的各种大小:
internal_config.hugepage_info[i].hugepage_sz
x86_64平台一般只有2MB大小和1GB大小。
2、通过读取 /proc/mounts 文件内容得到当前大小大页的挂载目录:
internal_config.hugepage_info[i].hugedir
如果还没有挂载当前大小的大页,则跳出继续判断下一个大小的大页。
3、得到当前大小的大页的总个数:
internal_config.hugepage_info[i].num_pages[0]
暂时保存在 socket 0 上
4、/sys/kernel/mm/hugepages 目录下的子目录分析完后,最终确定不同的大页大小的数量,保存到:
internal_config.num_hugepage_sizes
5、根据不同的大页大小,对internal_config.hugepage_info[i] 进行排序,使其按大页的大小从大到小排序。
6、检查确认是否至少获得到了一种大小的大页,也就是有至少一种大小的大页内存可用,如果有则返回0,否则返回-1。
————————————————————
原创文章,转载请注明: 转载自孙希栋的博客