您的位置:首页 > 其它

intel dpdk api rte_eal_hugepage_attach() 函数介绍

2013-07-09 19:07 357 查看
声明:此文档只做学习交流使用,请勿用作其他商业用途
author:朝阳_tony
E-mail : linzhaolover@gmail.com
Create Date: 2013-7-9 11:20:58 Tuesday
Last Change: 2013-7-9 11:21:42 Tuesday

转载请注明出处:http://blog.csdn.net/linzhaolove

此文中源码可以去http://dpdk.org/dev 网页中下载;更多官方文档请访问http://dpdk.org

1、函数用途

/*
* This creates the memory mappings in the secondary process to match that of
* the server process. It goes through each memory segment in the DPDK runtime
* configuration and finds the hugepages which form that segment, mapping them
* in order to form a contiguous block in the virtual memory space
*/
static int
rte_eal_hugepage_attach(void)

这个函数,一般是在启动第二个dpdk相关的程序时,才会启动,获取第一次启动相关的hugepage配置信息;

2、函数详解

if (aslr_enabled() > 0)
函数首先调用aslr_enabled()函数,去检查内核地址空间的随机是否使能,避免重复映射于第一次映射相同地址的虚拟地址;
主要判断/proc/sys/kernel/randomize_va_space这个文件中的值,我的系统取值吃2,说明地址空间随机使能了;
*    0 - address space randomization disabled

 *    1/2 - address space randomization enabled

 *    negative error code on error

fd_hugepage = open(eal_hugepage_info_path(), O_RDONLY);
去打开/var/run/.rte_hugepage_info文件,获取相关数据;
size = getFileSize(fd_hugepage);
hp = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd_hugepage, 0);
获取第一次hugepage的所有结构体信息,我之前配置的是1024,应该是有1024个,struct  hugepage;

base_addr = mmap(mcfg->memseg[s].addr, mcfg->memseg[s].len,
PROT_READ, MAP_PRIVATE, fd_zero, 0);
这断代码是去向系统一块连续的,1024*2M个大小的虚拟空间,一次性申请,才能够连续;然后在释放它;这样系统应该会有一块连续的空余空间;

fd = open(hp[i].filepath, O_RDWR);
if (fd < 0) {
RTE_LOG(ERR, EAL, "Could not open %s\n",
hp[i].filepath);
goto error;
}
addr = mmap(RTE_PTR_ADD(base_addr, offset),
hp[i].size, PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_FIXED, fd, 0);
这一段代码是,将之前的在/mnt/huge目录下创建的映射文件,在这打开,重新映射一遍,这时是不需要对物理地址排序,因为,之前的primary已经对物理地址进行了排序,现在每次映射获得的地址是连续的;

我技术水平有限,只能看懂部分内容,如有问题,可以留言,互相交流,互相学习!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  intel dpdk api