dpdk学习二

DPDK学习二

1、EAL抽象层

  • DPDK 加载和启动
  • 支持多进程和多线程执行类型
  • 核心关联/分配程序
  • 系统内存分配/解除分配
  • 原子/锁定操作
  • 时间参考
  • PCI 总线访问
  • 跟踪和调试功能
  • CPU 特征识别
  • 中断处理
  • 报警操作
  • 内存管理(malloc)

1.1 linux用户态的EAL

EAL 在hugetlbfs 中使用mmap() 执行物理内存分配(使用巨大的页面大小来提高性能)。该内存暴露给 DPDK 服务层。

DPDK 应用程序使用 pthread 库作为用户空间应用程序运行。

时间参考由 CPU 时间戳计数器 (TSC) 或 HPET 内核 API 通过 mmap() 调用提供。

1.1.1 初始化和启动

部分初始化由 glibc 的 start 函数完成。在初始化时还会进行检查,以确保 CPU 支持在配置文件中选择的微架构类型。然后,调用 main() 函数。核心初始化和启动在 rte_eal_init() 中完成。

在这里插入图片描述

代码如下:

int main(int argc, char **argv)
{
	const unsigned flags = 0;
	const unsigned ring_size = 64;
	const unsigned pool_size = 1024;
	const unsigned pool_cache = 32;
	const unsigned priv_data_sz = 0;

	int ret;
	unsigned lcore_id;

	ret = rte_eal_init(argc, argv);
	if (ret < 0)
		rte_exit(EXIT_FAILURE, "Cannot init EAL\n");

	/* Start of ring structure. 8< */
	if (rte_eal_process_type() == RTE_PROC_PRIMARY){
		send_ring = rte_ring_create(_PRI_2_SEC, ring_size, rte_socket_id(), flags);
		recv_ring = rte_ring_create(_SEC_2_PRI, ring_size, rte_socket_id(), flags);
		message_pool = rte_mempool_create(_MSG_POOL, pool_size,
				STR_TOKEN_SIZE, pool_cache, priv_data_sz,
				NULL, NULL, NULL, NULL,
				rte_socket_id(), flags);
	} else {
		recv_ring = rte_ring_lookup(_PRI_2_SEC);
		send_ring = rte_ring_lookup(_SEC_2_PRI);
		message_pool = rte_mempool_lookup(_MSG_POOL);
	}
	/* >8 End of ring structure. */
	if (send_ring == NULL)
		rte_exit(EXIT_FAILURE, "Problem getting sending ring\n");
	if (recv_ring == NULL)
		rte_exit(EXIT_FAILURE, "Problem getting receiving ring\n");
	if (message_pool == NULL)
		rte_exit(EXIT_FAILURE, "Problem getting message pool\n");

	RTE_LOG(INFO, APP, "Finished Process Init.\n");

	/* call lcore_recv() on every worker lcore */
	RTE_LCORE_FOREACH_WORKER(lcore_id) {
		rte_eal_remote_launch(lcore_recv, NULL, lcore_id);
	}

	/* call cmd prompt on main lcore */
	struct cmdline *cl = cmdline_stdin_new(simple_mp_ctx, "\nsimple_mp > ");
	if (cl == NULL)
		rte_exit(EXIT_FAILURE, "Cannot create cmdline instance\n");
	cmdline_interact(cl);
	cmdline_stdin_exit(cl);

	rte_eal_mp_wait_lcore();

	/* clean up the EAL */
	rte_eal_cleanup();

	return 0;
}

1.1.2 关机与清理

EAL初始化,大页面支持的内存由核心组件分配,期间分配的内存rte_eal_init() 可以通过调用rte_eal_cleanup()函数来释放。

1.1.3 多进程支持

可见范例代码。

1.1.4 内存映射和内存预留

大连续物理内存是使用hugepage实现。EAL提供了API在这段连续内存保留named memory zones,这段保留的内存(memory zones)的物理地址会通过保留的API返回给用户。

DPDK 内存子系统可以运行两种模式:动态模式和传统模式。

1.1.4.1 动态模式

在这种模式,DPDK 应用程序对大页面的使用会根据应用程序的请求而增长和缩小。程序调用rte_malloc()或者rte_memzone_reserve()其他方法进行内存分配,这可能导致从系统中保留更多大页面。同样的,释放可能导致大页面被返回系统。

1.1.4.2 传统模式

EAL 将在启动时保留所有内存,将所有内存分类为大的 IOVA 连续块,并且不允许在运行时从系统获取或释放大页面。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值