前言
本文主要记录一下dpdk源码编译与动态库的使用,学习脱离编译环境后如何单独使用dpdk动态开发库,在以后的项目中不在编译dpdk源码,直接使用编译后的头文件、动态库和igb_uio.ko文件。
一、开发环境:
硬件环境: win10 vmware虚拟机,虚拟网卡型号为Intel 82545EM
操作系统: centos7.4
dpdk版本: 16.04
二、编译与安装
1、修改源码
为避免在centos6虚拟机上编译和使用dpdk时出现的问题,需要修改dpdk-16.04/lib/librte_eal/linuxapp/igb_uio/igb_uio.c文件,详见https://blog.csdn.net/qiqicao123456/article/details/108473455
2、修改配置文件
dpdk16.04默认编译静态库,编译动态库需要修改配置文件dpdk-16.04/config/common_base,设置编译成动态库
# Compile to share library
#
CONFIG_RTE_BUILD_SHARED_LIB=y
为避免编译kni模块时出现的编译错误,可以修改配置文件dpdk-16.04/config/ommon_linuxapp,关闭编译KNI模块的配置
CONFIG_RTE_KNI_KMOD=n
CONFIG_RTE_LIBRTE_KNI=n
3、源码编译安装
1、设置环境变量
RTE_SDK是代码顶层目录
RTE_TARGET是选择编译平台,这里是64位linux系统,使用gcc编译。
export RTE_SDK=/root/dpdk-16.04
export RTE_TARGET=x86_64-native-linuxapp-gcc
2、编译安装
DESTDIR是安装目录
make install T=$RTE_TARGET DESTDIR=/usr/local/dpdk
如果设置了DESTDIR的环境变量,命令行上也可以不加这个参数,上面的命令可以写成
export DESTDIR=/usr/local/dpdk
make install T=$RTE_TARGET
注意,设置了T参数没有设置DESTDIR参数或者环境变量时,是不会安装的。
如果没有T参数和DESTDIR参数或者环境变量,默认安装到/usr/local下面。
安装完成后,会在/usr/local/dpdk目录下生成以下文件,基于dpdk开发自己的程序时只需要用到inclue和lib(lib目录下包含igb_uio.ko文件)
三、开发库使用
1、dpdk环境搭建
step1 创建大页
echo 256 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
mkdir /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
step2 加载igb_uio.ko模块
modprobe uio
insmod igb_uio.ko
step3 绑定网卡(假设两个网口地址为02:02.0 02:03.0)
./dpdk_nic_bind.py -b igb_uio 02:02.0 02:03.0
2、将开发库放到任意目录下
此处将编译后的头文件、库文件、igb_uio.ko放到/root/dpdk/目录下,然后设置LD_LIBRART_PATH环境变量
3、编译自己的dpdk程序
自己的dpdk程序可以放在任一目录下,但是必须包含rte_config.h头文件,否则编译时会应为缺少宏定义而报错。
[root@prism helloworld]# gcc main.c -I /root/dpdk/ -L /root/dpdk/lib/ -lrte_eal -lrte_mempool -lrte_ring
In file included from main.c:40:0:
/root/dpdk/include/rte_memory.h:83:2: 错误:#error "Unsupported cache line size"
#error "Unsupported cache line size"
^
In file included from main.c:43:0:
/root/dpdk/include/rte_eal.h:82:35: 错误:‘RTE_MAX_LCORE’未声明(不在函数内)
enum rte_lcore_role_t lcore_role[RTE_MAX_LCORE]; /**< State of cores. */
编译自己的dpdk程序时,指定dpdk头文件目录、链接指定的dpdk动态库即可