DPDK: 编译及“Hello World”

3 篇文章 0 订阅

1. 环境准备

配置环境如下:

VMware 12.5.9。

Ubuntu 18.04,64位 (32位系统类似,根据实际情况调整相关编译参数),虚拟3 个网卡,2*2核cpu,2G内存。

DPDK 19.11.1(LTS),这里可以下载到你比较中意的其他版本http://static.dpdk.org/rel/

GCC 7.5。

 

2. 修改网卡型号

在VMware虚拟环境跑DPDK需要将虚拟网卡修改为DPDK支持的型号,19.11支持的网卡及其驱动如下,具体请参考官网 doc.dpdk.org/guides-19.11/nics/overview.html

Featurea f p a c k e ta r ka t l a n t i ca v fa v f . . . . . v e ca v pa x g b eb n x 2 xb n x 2 x v fb n x tb o n d i n gc x g b ec x g b e v fd p a ad p a a 2e 1 0 0 0e n ae n e t ce n i cf a i l s a f ef m 1 0 kf m 1 0 k v fi 4 0 ei 4 0 e . . . . v e ci 4 0 e v fi 4 0 e v f . . v e ci f c v fi g bi g b v fi x g b ei x g b e . . . v e ci x g b e v fi x g b e v f . v e ck n il i q u i d i om l x 4m l x 5m v n e t am v p p 2n e t v s cn f pn f p v fn u l lo c t e o n t xp c a pq e d eq e d e v fr i n gs f c _ e f xs o f t n i cs z e d a t a 2t a pt h u n d e r xv d e v _ n e t v s cv h o s tv i r t i ov i r t i o . . v e cv m x n e t 3
Speed capabilities YYYY YPPY YYPPPP   PPYY   P YY   YPYYYPYY Y YY Y PPY  PPP
Link status  YYYYYYYY YYYYY YYYYYYYYY YYYYYY YYYYYYYY Y YY Y YYY YYYY
Link status event  Y    YYY    YY  YYYYYY   Y YY   YYY   YY      Y  YY  YYY
Removal event                                   YY                     
Queue status event                                                      Y   
Rx interrupt   YY    Y     Y  YYYYYYYY YYYYYY  YY   YY         Y   YY 
Lock-free Tx queue                                           Y              
Fast mbuf free                                                Y         
Free Tx mbuf on demand               Y                       Y              Y   
Queue start/stop YYYY    Y YY Y Y YYYYYYYY   YY    YY  YYY P    Y Y Y  YYY
Runtime Rx queue setup                   Y  Y                         Y         
Runtime Tx queue setup                   Y  Y                         Y         
MTU update  YYY    Y YYYYYY YY       Y YYYY YYYYYYYY   YY Y  YY  Y Y
Jumbo frame YYYYYY  Y YYYYYY YYYYYYYY Y YYYY YYYYY YY YYYY Y   Y    Y
Scattered Rx Y YYY     YYY YY Y YYYYYY YYYYYY YYY  Y     YY Y Y Y  Y  
LRO         Y                   YYYY            YY          Y
TSO   YY    Y YY   Y Y YYYYYY YYYYYY  YY   YY   YY Y        Y
Promiscuous mode  YYYYYYYY YYYYY  YYY YYYY YYYY   YYYYYYYY Y YY Y YYY  YYY
Allmulticast mode  YYY Y  Y YYYYY  YYY YYYY YYYYYY YYY YY     YY Y YYY  YYY
Unicast MAC filter  YYYY YYY   YYY  YYY YYYY YYYYYY  YYYY    P YY    Y   YYY
Multicast MAC filter   YY  YYY         YY YYYY         YY Y      YY Y  Y   YY 
RSS hash  YYY Y  Y YYYY Y Y YYYYYY Y YYYY YYY Y YY   YY Y   Y    Y
RSS key update  YYY    Y Y    Y Y YYYYYY Y YYYY Y Y   YY   YY Y   Y     
RSS reta update  YYY    Y      Y Y YYYYYY Y YYYY Y Y   YY   YY Y   Y     
Inner RSS                  Y                 Y                     
VMDq         Y          Y YY   Y YY                           
SR-IOV        YY      Y Y   YY   Y YY    YY         Y Y   Y     
DCB                      YY   Y YY                           
VLAN filter  YYY    Y    YY   YY YYYY YYYYYY YYY Y      YY        YYY
Ethertype filter         Y            YY   Y YY                           
N-tuple filter         Y                 Y YY              Y            
SYN filter                           Y YY                           
Tunnel filter                      YY     YY              Y            
Flexible filter                           Y                              
Hash filter                      YYYY                                
Flow director         Y        Y   YY     YY     Y        Y            
Flow control  Y      Y Y YYY   Y  YY   Y YY    YY Y YY   YY Y  Y      
Flow API         Y Y      YY  Y    Y Y     YY        Y  Y  Y      
Rate limitation                             YY                           
Traffic mirroring                      YY     YY                           
Inline crypto                             YYYY                         
CRC offload  YYY Y  Y YY  YY Y YYY Y  YYY Y  YYYYY    Y YY     Y     
VLAN offload  YYPY   Y YY YYY Y YYY Y  YYY Y  P Y   YY   YY P   P    Y
QinQ offload               Y      Y Y  YYY Y                          
L3 checksum offload  YYP Y  Y YYYYYY Y YYY Y  YYY Y  YYYYY YY   YY Y  YY     
L4 checksum offload  YYP Y  Y YYYYYY Y YYY Y  YYY Y  YYYYY YY   YY Y  YY    Y
Timestamp offload                                    Y                     
MACsec offload                             Y                            
Inner L3 checksum         Y      Y Y   Y Y    Y Y  YYY        Y  Y         
Inner L4 checksum         Y      Y Y   Y Y    Y Y  YYY        Y  Y         
Packet type parsing  YYY    Y YYYY  YYYYYY Y  YYY Y   YYYY    Y YY Y  YY    Y
Timesync         Y            YY   Y YY                           
Rx descriptor status  YYY    Y     Y    Y YYYY YYYYYY   Y           Y         
Tx descriptor status  YYY    Y     Y    Y YYYY YYYYYY   Y           Y         
Basic stats YYYYYYYYY YYYYYY YYYYYYYY YYYYYY YYYYYYYY YYYY Y YYY YYYY
Extended stats  Y    YYY   YY Y   YYYYYY YYYYYY Y Y YY     YY Y Y   YY Y
Stats per queue YY  Y     YY      YYY       YY    YY  YYY   YY   Y Y  YYY
FW version  Y      Y   YY       Y    Y Y                  Y         
EEPROM dump  Y      Y Y               Y YY                           
Module EEPROM dump                      YY   Y YY                           
Registers dump  Y        Y               YYYYYY                   Y     
LED         Y                                                
Multiprocess aware   YY      YY     Y YYYYYY   YYYY Y Y  Y    YYY Y   Y  Y  
BSD nic_uio   YY      Y   Y  Y YYYYYY YYYYYY               Y      YY 
Linux UIO YYYYYYYYY YY  YY Y YYYYYY YYYYYY Y     YY   YY Y      YYY
Linux VFIO   YY    Y YY YYYYY YYYYYY YYYYYY Y     YY Y YY Y   Y  YYY
Other kdrv                                   YY  Y          YY      
ARMv7                   Y                   Y    Y      Y Y YY 
ARMv8  Y      Y   YY  Y Y  YY Y   YYYY   YYYY   YYYY    YYY YY 
Power8                   Y  YY           YY       Y      Y Y    
x86-32  YYY Y  Y YY  YY YYYYYYYYYYYYYYY  YY  Y    YYY  Y Y YYYYY
x86-64 YYYYYYYYY YY  YY YYYYYYYYYYYYYYY YYY  YYY  YYY YYYY YYYYY
Usage doc Y     YY  YYYY  YYY             YYYYYYYYY YYYY  YYYYY Y Y
Design doc                                                          
Perf doc                                                          

 编辑虚拟机配置文件xx.vmx文件,修改网卡的virtualDev值,如e1000则表示虚拟intel千兆以太网卡

ethernet1.virtualDev = "e1000"
ethernet2.virtualDev = "e1000"

另外微软的hyper-v虚拟化环境也可以跑DPDK,但hyper-v无法虚拟出DPDK支持的网卡。在hyper-v环境跑DPDK需要使用netvsc网卡驱动,nstvsc是DPDK提供的hyper-v专用网卡驱动。网卡与netvsc驱动的绑定不能使用dpdk-devbind.py工具,而是另一个工具driverctl,或者手动绑定也可以,官方的帮助文档给出了详细的步骤说明。

 

3. 编译DPDK源码

1)首先得安装依赖

sudo apt  install libnuma-dev

2)设置环境变量

export RTE_SDK=/home/walnut/Project/dpdk-stable-19.11.1

3)配置

make defconfig(使用默认配置,配置文件及编译输出 至build目录)

可以手动指定编译目标模板和目标目录,如“make config T=x86_64-native-linux-gcc O=build-x64”,O=build-x64指定编译输出目标目录,不指定O参数则默认输出至build目录。

使用make showconfigs可查看支持的目标模板。

4)愉快地编译吧

make  EXTRA_CFLAGS="-O0 -g"

 

4. 加载内核驱动

modprobe uio
insmod $RTE_SDK/build/kmod/igb_uio.ko

 

5. 绑定网卡驱动

1)首先使用python脚本dpdk-devbind.py查看网卡状态

./usertools/dpdk-devbind.py --status

可以查看到物理地址,当前驱动等信息,如下所示。

如果被绑定的网卡为Active状态,需要先禁用,ifconfig xxxx down,然后再绑定。

Network devices using DPDK-compatible driver
============================================
<none>

Network devices using kernel driver
===================================
0000:02:01.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=ens33 drv=e1000 unused=igb_uio *Active*

Other Network devices
=====================
0000:02:06.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' unused=e1000,igb_uio
0000:02:07.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' unused=e1000,igb_uio

2)绑定网卡2和3的驱动为igb_uio

./usertools/dpdk-devbind.py -b igb_uio 02:06.0 02:07.0

3) 绑定完事后,不要着急,先看看绑定状态,确保已经成功

./usertools/dpdk-devbind.py --status

如果drv=igb_uio,即表示网卡当前驱动为igb_uio,恭喜你,的确绑定成功,可以往下走了。

Network devices using DPDK-compatible driver
============================================
0000:02:06.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' drv=igb_uio unused=e1000
0000:02:07.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' drv=igb_uio unused=e1000

Network devices using kernel driver
===================================
0000:02:01.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=ens33 drv=e1000 unused=igb_uio *Active*

 

6. 设置大页内存

echo 256 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
mkdir -p /mnt/huge
mount -t hugetlbfs nodev /mnt/huge

 

7. 编译示例程序

编译helloworld

cd examples/helloworld
make

运行helloworld

./build/helloworld 

结果如下

EAL: Detected 4 lcore(s)
EAL: Probing VFIO support...
EAL: NUMA support not available consider that all memory is in socket_id 0
EAL: PCI device 0000:02:01.0 on NUMA socket 0
EAL:   probe driver: 8086:100f net_e1000_em
EAL: PCI device 0000:02:06.0 on NUMA socket 0
EAL:   probe driver: 8086:100f net_e1000_em
EAL: PCI device 0000:02:07.0 on NUMA socket 0
EAL:   probe driver: 8086:100f net_e1000_em
hello from core 1
hello from core 2
hello from core 3
hello from core 0

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值