内存管理
rte_malloc
rte_malloc(const char *type, size_t size, unsigned align);
类同malloc,从内存的huge_page中分配所需内存空间,分配的空间未被初始化. 成功返回分配的内存空间的起始地址。
type: 分配的内存块名称
size:分配的内存块大小, size为0返回NULL
align:对齐字节数,0和2的倍数,否则返回NULL,为0时任意长对齐
rte_free
void rte_free(void *addr);
类同free,释放addr指向的内存空间
addr: 需要被释放的空间起始地址,如果addr为NULL,则不做任何改变
rte_zmalloc
void *rte_zmalloc(const char *type, size_t size, unsigned align);
和rte_malloc基本相同,只是额外将申请的内存空间初始化为0
rte_calloc
void *rte_calloc(const char *type, size_t num, size_t size, unsigned align);
类同calloc,和rte_malloc基本相同,申请的总空间大小为num * size,申请了num个连续空间,每个空间的大小为size。内存空间初始化为0。
num: 需要申请的空间数量
size:每个空间的大小
rte_realloc
void *rte_realloc(void *ptr, size_t size, unsigned align);
类同realloc,重新分配ptr指向的内存空间的大小。如果size为0,则释放此ptr指向空间。
size: 重新分配后的空间大小
rte_malloc_virt2iova(老版本dpdk该函数是rte_malloc_virt2phy)
rte_iova_t rte_malloc_virt2iova(const void *addr);
将rte_malloc分配的虚拟地址转化为物理地址
内存分配使用示例
#include <stdio.h>
#include <rte_malloc.h>
int main(int argc, char *argv[])
{
int rc;
char *mr_region;
rte_iova_t phy_addr;
/* eal必须初始化,否则内存会分配失败 */
rc = rte_eal_init(argc, argv);
if (rc != 0) {
rte_panic("rte init failed\n");
}
mr_region = rte_malloc("mr_region", 32, 64);
if (mr_region == NULL) {
printf("Cannot allocate memory for mr_region\n");
return -1;
}
printf("Allocate memory for mr_region success\n");
/* 将虚拟地址转换为物理地址 */
phy_addr = rte_malloc_virt2iova(mr_region);
printf("mr_region virt addr = %p, phy addr = 0x%lx\n", mr_region, phy_addr);
rte_free(mr_region);
return 0;
}
# 编译
gcc rte_malloc.c -o rte_malloc -L/usr/local/lib/x86_64-linux-gnu/dpdk/pmds-22.0/ -lrte_eal -ldl
# 运行
root@cjhjy-virtual-machine:/Images/git/dpdk-example# ./rte_malloc
EAL: Detected CPU lcores: 2
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: No available 1048576 kB hugepages reported
EAL: VFIO support initialized
TELEMETRY: No legacy callbacks, legacy socket not created
Allocate memory for mr_region success
mr_region virt addr = 0x1003e9ec0, phy addr = 0x57e9ec0
参考链接
blog.csdn.net/sollor525/a… (内存管理个参数解释说明)