DPDK学习记录14 - 内存申请2之rte_memzone_reserve

1 rte_memzone_reserve

rte_memzone_reserve_thread_safe 这个基本的函数上封装了三个对外的函数接口:rte_memzone_reserve/rte_memzone_reserve_aligned/rte_memzone_reserve_bounded。

rte_memzone_reserve_thread_safe加了锁之后调用 memzone_reserve_aligned_thread_unsafe,由下面的代码可以看出,memzone的申请最终调用malloc_heap_alloc。

static const struct rte_memzone *memzone_reserve_aligned_thread_unsafe(const char *name, size_t len,int socket_id, unsigned int flags, unsigned int align,unsigned int bound)
{
	mcfg = rte_eal_get_configuration()->mem_config;
	arr = &mcfg->memzones; 	//memzones是一个fbarray。
	if (len == 0 && bound == 0) {
		requested_len = 0; 		/* no size constraints were placed, so use malloc elem len */
		mz_addr = malloc_heap_alloc_biggest(NULL, socket_id, flags,	align, contig);
	} else {
		if (len == 0)
			requested_len = bound;
		mz_addr = malloc_heap_alloc(NULL, requested_len, socket_id,	flags, align, bound, contig); /* allocate memory on heap */
	}
	if (mz_addr == NULL) {
		rte_errno = ENOMEM;
		return NULL;
	}
	
	struct malloc_elem *elem = malloc_elem_from_data(mz_addr);

	/* fill the zone in config */
	mz_idx = rte_fbarray_find_next_free(arr, 0);

	if (mz_idx < 0) {
		mz = NULL;
	} else {
		rte_fbarray_set_used(arr, mz_idx);
		mz = rte_fbarray_get(arr, mz_idx);
	}

	snprintf(mz->name, sizeof(mz->name), "%s", name);
	mz->iova = rte_malloc_virt2iova(mz_addr);
	mz->addr = mz_addr;
	mz->len = requested_len == 0 ?
			elem->size - elem->pad - MALLOC_ELEM_OVERHEAD :
			requested_len;
	mz->hugepage_sz = elem->msl->page_sz;
	mz->socket_id = elem->msl->socket_id;
	mz->flags = 0;

	return mz;
}

2 gdb调试

2.1 通过rte_memzone_reserve申请内存
在这里插入图片描述

2.2 调用到memzone_reserve_aligned_thread_unsafe

查看rte_config->mem_config->memzones的arr变量可知,当下counter为0,没有申请过memzone。
在这里插入图片描述

2.3 通过malloc_heap_alloc申请内存得到mz_addr

在这里插入图片描述

2.4 通过mz_addr得到malloc element,然后申请一个free的memzone id且占住这个free的id,第一个free的id值为0,而后可以看到arr中的counter变成了1。
在这里插入图片描述

2.5
对mz中的其他字段赋值
在这里插入图片描述

3 总结

按我理解,memzone是在heap之上的一层封装,通过fbarray机制管理。fbarray中data区域中,保存了每个memzone结构体的内容,包括name/iova/len/socket id等。用户可以通过memzone name在fbarray中查询已有的memzone结构。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值