nvme用户态驱动-参考01-dpdk-v21.11常用api

545 阅读2分钟

内存管理

rte_malloc

rte_malloc(const char *type, size_t size, unsigned align);
类同malloc,从内存的huge_page中分配所需内存空间,分配的空间未被初始化. 成功返回分配的内存空间的起始地址。
type: 分配的内存块名称
size:分配的内存块大小, size为0返回NULL
align:对齐字节数,02的倍数,否则返回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… (内存管理个参数解释说明)