您的位置:首页 > 其它

intel dpdk eal_hugepage_info_init() 函数介绍

2013-07-07 19:03 661 查看
声明:此文档只做学习交流使用,请勿用作其他商业用途
author:朝阳_tony
E-mail : linzhaolover@gmail.com
Create Date:2013-7-7 16:21:15 Sunday
Last Change: 2013-7-7 16:21:22 Sunday

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

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

hugepage 介绍

系统进程是通过虚拟地址访问内存,但是CPU必须把它转换程物理内存地址才能真正访问内存。为了提高这个转换效率,CPU会缓存最近的虚拟内存地址和物理内存地址的映射关系,并保存在一个由CPU维护的映射表中。为了尽量提高内存的访问速度,需要在映射表中保存尽量多的映射关系。 
而在Redhat Linux中,内存都是以页的形式划分的,默认情况下每页是4K,这就意味着如果物理内存很大,则映射表的条目将会非常多,会影响CPU的检索效率。因为内存大小是固定的,为了减少映射表的条目,可采取的办法只有增加页的尺寸。这种增大的内存页尺寸在Linux 2.1中,称为Big page;在AS 3/4中,称为Hugepage。 
如果系统有大量的物理内存(大于8G),则物理32位的操作系统还是64位的,都应该使用Hugepage。 
注意:使用Hugepage内存是共享内存,它会一直keep在内存中的,不会被交换出去,也就是说使用hurgepage的内存不能被其他的进程使用,所以,一定要合理设置这个值,避免造成浪费。

摘自:http://jackyrong.iteye.com/blog/723172

1、函数作用

eal_hugepage_info_init

去获取 当前系统的hugepage 信息;

2、函数详解

DIR *dir = opendir(sys_dir_path);
打开"/sys/kernel/mm/hugepages"文件夹,hugepage的配置信息在这;

hpi->hugepage_sz = rte_str_to_size(&dirent->d_name[dirent_start_len]);
hpi->num_pages = get_num_hugepages(dirent->d_name);
hpi->hugedir = get_hugepage_dir(hpi->hugepage_sz);
上面这段程序,获得当前hugepage的页大小,默认的应该是2048kB;

num_pages 是当前配置了多少个或者自己制定分配了多少个2M大小的memory;
cat /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
我的是1024,你也可以自己设定;
echo 1024 >  /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages


hpi->hugedir是hugepage 配置目录,
/sys/kernel/mm/hugepages/hugepages-2048kB/

/* sort the page directory entries by size, largest to smallest */
for (i = 0; i < num_sizes; i++){
unsigned j;
for (j = i+1; j < num_sizes; j++)
if (internal_config.hugepage_info[j-1].hugepage_sz < \
internal_config.hugepage_info[j].hugepage_sz)
swap_hpi(&internal_config.hugepage_info[j-1],
&internal_config.hugepage_info[j]);
}
按照page尺寸,排序目录,由于我的机器只有2048kB这个尺寸,所以,无需排序;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  intel dpdk study